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

如果你真的必须使用一个没有计数器缓存的查询:

@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.

如您所见,这很快就会变得丑陋。最好坚持使用计数器缓存,或者执行两个单独的查询。

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