2011-01-15 4 views
3

よく使われるようにすべての投稿タグのリストを表示したいと思います。最もよく使われるタグ(タグ.posts.count)

私のコントローラは、現在持っている:

@tag_list = Tag.all 

私のビューがあります。関係のようにしている

<% @tag_list.each do |tag| %> 
    <%= tag.name %>(<%= tag.posts.count %>) 
<% end %> 

EDITは、次のとおりです。

Tag (has_many :posts, :through => :taggings) 
Tagging(belongs_to :tag and belongs_to :post) 
Post(has_many :tags, :through => :taggings) 

これは彼らの数を持つすべてのタグが表示されます。私はTag.order(..)を使用してコントローラで遊んでみましたが、うまくいくようには見えません。

ご協力いただければ幸いです。

ありがとうございました。

答えて

3

counter_cacheオプションをアソシエーションに追加することによって、タグを使用する投稿の数を自動的に維持するようにrailsに指示できます。

belongs_to :tag, :counter_cache => true 

移行経由:あなたの投稿モデルに

has_many :posts, :counter_cache => true 

:あなたのタグのモデルに

add_column :tags, :posts_count, :integer, :null => false, :default => 0 

いつでもあなたはそのタグで投稿を追加、タグカウンタは1だけインクリメントされます。その後、簡単でのご注文を実行することができますActiveRecordのアソシエーション方法とオプションの

Tags.order('posts_count') 

詳しい情報はhereを見つけることができます。

+0

投稿とタグが「has_and_belongs_to」関係にある場合はうまくいかないと思っています...実際には本当にそうでしょうか? –

+0

フィードバックをいただきありがとうございます...私は関係タグ(has_many:posts、:through:>タグ付け)、タグ付け(belongs_to:タグand belongs_to:post)、投稿(has_many:tags、:through =>:タグジング) – Goldy

+0

@Andy:ええと、has_and_belongs_to_manyという関係はcounter_cacheではうまく動作しないと確信しています。代わりに、Observerを介して手動でカウントを維持し、モデルのライフサイクルのafter_create/after_destroy部分に機能を追加するか、has_many:through関係を確立する必要があります。 – Shaun

関連する問題