2012-06-08 12 views
9

私はアイテムをリストし、各アイテムにタグを追加できるアプリケーションがあります。Rails 3注文数has_many:through

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 

だから、これは多対多の関係は、私は、各項目のNタグを設定することができますし、同じタグが使用できます。 モデルアイテムタグは次のように関連しています数回。

このタグに関連付けられたアイテムの数で並べ替えられたすべてのタグをリストしたいと思います。より多く使用されるタグ、最初に表示されます。あまり使われず、最後に。

どうすればいいですか?

よろしくお願いいたします。

答えて

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列を必要とする、すべてのまっすぐを休む必要

をグループ化とに参加します。

はところで、なぜあなたはhttps://github.com/mbleigh/acts-as-taggable-on

+0

これを試していけないはあなたの助けのためにありがとうございました。そして私はそのプラグインを試してみる。 – goo

+0

+1 Amol。この同じクエリ結果をどのように達成するかについては、has_many through:?私の質問[http://stackoverflow.com/questions/19537378/ordering-nested-has-many-through-by-count-of-associations]は、グループのメンバーであるgooのアイテムに類似していて、次にタグを一覧表示しようとします個々のグループの項目のうちではなく、グループ内での使用頻度の順に表示されます。ありがとう! –

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" 
関連する問題