2012-06-08 74 views
9

我有一個應用程序,我可以列出項目併爲每個項目添加標籤。 該機型項目標籤都喜歡此相關:Rails 3順序依靠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') 

嘗試遞減,遞增,看到了差距。

我們需要選擇,有TAG_COUNT列,我們需要TAG_COUNT列申請爲了它,其餘全部直截了當加入分組

順便說一句,你爲什麼不試試這個https://github.com/mbleigh/acts-as-taggable-on

+0

非常感謝您的幫助。我會嘗試這個插件。 – goo

+0

+1 Amol。你對如何完成同樣的查詢結果有任何想法,但有另一層has_many通過:?我的問題[http://stackoverflow.com/questions/19537378/ordering-nested-has-many-through-by-count-of-associations]將類似於goo的Items作爲Groups的成員,然後嘗試列出標籤根據其在集團內的使用頻率,而不是所有項目中的單個項目組。謝謝! –

3

你會希望有一個更好的方法,但這對我有用(沒有空白)。假設name是標記模型的名稱屬性。

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"