2012-06-08 2 views
9

У меня есть приложение, в котором я могу перечислить элементы и добавить теги к каждому элементу. Модели Элементы и Метки связаны, как это:Rails 3 Order By Count on has_many: через

class Item < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, :through => :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :item 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :items, :through => :taggings 
end 

Таким образом, это многие-ко-многим позволяет мне установить п теги для каждого пункта, и тот же тег может быть использован несколько раз.

Я бы хотел перечислить все теги, упорядоченные по количеству элементов, связанных с этим тегом. Больше используемых тегов, показывает сначала. Менее используемые, последние.

Как я могу это сделать?

С уважением.

ответ

8
Tag.joins(:taggings).select('tags.*, count(tag_id) as "tag_count"').group(:tag_id).order(' tag_count desc') 

попробовать это DESC, ASC и увидеть разницу.

Нам нужно выбрать, чтобы иметь столбец tag_count, и нам нужно tag_count столбец применять порядок к нему, остальные все прямо вперед присоединиться и группировки.

Btw, почему бы вам не попробовать это https://github.com/mbleigh/acts-as-taggable-on

+0

Большое спасибо за вашу помощь. И я попробую этот плагин. – goo

+0

+1 Амол. У вас есть идея о том, как выполнить этот же результат запроса, но с другим слоем has_many через :? Мой вопрос [http://stackoverflow.com/questions/19537378/ordering-nested-has-many-through-by-count-of-associations] будет аналогичен элементам Goo, являющимся членами групп, а затем пытается перечислить теги отдельной Группы предметов в порядке их частотности использования внутри Группы, а не среди всех предметов. Благодаря! –

3

Вы надеетесь, что есть лучший способ, но это сработало для меня (без пробелов). Предположим, name - это атрибут имени модели Tag.

foo = Tagging.select("name, count(item_id) as item_count") 
     .joins("inner join tags on taggings.tag_id = tags.id") 
     .group("name") 
     .order("item_count DESC") 

foo.each { |r| puts "number of items tagged #{r.name}: #{r.item_count}"} 

-->"number of items tagged Bieber: 100" 
-->"number of items tagged GofT: 99" 

 Смежные вопросы

  • Нет связанных вопросов^_^