#ruby-on-rails #ruby-on-rails-3 #acts-as-taggable-on
#ruby-on-rails #ruby-on-rails-3 #actes-as-taggable-on
Вопрос:
Acts-as-taggable отлично работает и все такое, но мне было интересно, есть ли способ ограничить облако тегов только самыми популярными тегами? Не так ли, похоже, что он упорядочивает мое облако по порядку, в котором были созданы теги.
Но более разумно, чтобы облако тегов отображало только самые популярные теги.
Мой контроллер имеет:
def styles_tag_cloud
@tags = Tattoo.tag_counts_on(:styles).limit(40)
end
и мой взгляд имеет:
<% tag_cloud(styles_tag_cloud, %w(css1 css2 css3 css4)) do |tag, css_class| %>
<%= link_to tag.name, { :action => :tagged, :controller =>:index, :id => tag.name }, :class => css_class %>
<% end %>
Но все, что это делает, это отображает первые 40 созданных тегов, а затем определяет размер каждого тега в зависимости от того, сколько раз он использовался
Ответ №1:
Вы можете использовать MyModel.tag_counts_on(:tags)
для получения списка тегов, упорядоченных по убыванию количества тегов (сначала наиболее используемый тег), и если вы хотите ограничить его определенным числом, вы можете просто добавить .limit(my_magic_number)
к нему.
Итак, чтобы получить список из 10 самых популярных тегов в вашей Post
модели, вы должны сделать что-то вроде этого:
@tag_counts = Post.tag_counts_on(:tags).limit(10)
Если затем вы хотите узнать, сколько раз использовался каждый тег, объекты в @tags
каждом имеют count
атрибут, на который вы можете посмотреть.
РЕДАКТИРОВАТЬ: (извлечено из одного из моих комментариев ниже)…и если вы хотите разместить теги в определенном порядке (сначала наиболее часто используемые теги) с некоторым внешним ограничением, вы можете использовать это: Post.tag_counts_on(:tags).order('count desc').limit(however_many_you_want)
Комментарии:
1.
tag_counts_on
задокументировано здесь: github.com/mbleigh/acts-as-taggable-on (найдите «Вычисления облака тегов» на странице)2. Я обновил свой вопрос, tag_counts_on simple захватывает все теги и подсчитывает каждый из них. Я пытаюсь либо упорядочить их по количеству тегов, либо отобразить только самые популярные теги
3. Ну, тогда сделайте что-то вроде
Post.tag_counts_on(:tags).order('count desc').limit(however_many_you_want)
.4. Спасибо @Frost — на самом деле это решение.
Ответ №2:
Согласно документации, вам просто нужно передать параметры, необходимые для ваших вычислений, в вашем случае (контроллер):
def styles_tag_cloud
@tags = Tattoo.tag_counts_on(:styles).limit(40)
end
Ваш вид остается прежним. С уважением!