1

私は次のモデルを持っています:

class Keyword < ActiveRecord::Base
  has_many :tags
  has_many :studies, :through => :tags
end

class Tag < ActiveRecord::Base
  belongs_to :keyword
  belongs_to :study
end

class Study < ActiveRecord::Base
  has_many :tags
  has_many :keywords, :through => :tags
end

すべてのキーワード、各キーワード、およびそのキーワードでタグ付けされた研究の数を含む配列が必要なので、次のように言えます。

<ul>
<% @keywords.each do |keyword| %>
  <li><%= "(#{keyword.number_of_studies}) #{keyword.title}") %></li>
<% end %>
</ul>

これは可能だと確信していますが、問題は次のとおりです。どのように?

4

1 に答える 1

3

カウンターキャッシュを使用できます。これにより、親オブジェクトの整数値が子の数とともに保持されます。ActiveRecord は追跡します。

class Post < AR::Base
  has_many :comments
end

class Comment < AR::Base
  belongs_to :post, :counter_cache => true
end

@post.comments_count

カウンタ キャッシュを使用せずに 1 つのクエリを使用する必要がある場合は、次のようにします。

@post = Post.find(first, :select => 'posts.*, count(comments.id) as comments_count',:joins => 'left outer join comments on comments.post_id = posts.id', :group => 'posts.id')
@post.comments_count #=> From join query.

ご覧のとおり、これはすぐに醜くなります。カウンター キャッシュを使用するか、2 つの個別のクエリを実行することをお勧めします。

@post = Post.find(:first) # SELECT FROM posts
@post.comments.count      # SELECT COUNT(1) FROM comments WHERE post_id = ?
于 2010-11-02T12:44:47.770 に答える