Rails 3 ActiveRecord 查询,返回模型的所有记录并在单个查询中包含关联记录的计数
我有以下模型:
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>
我确信这是可能的,问题是:如何?
I have the following models:
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
I want an array containing all of the keywords, and for each keyword, and count of the studies tagged with that keyword, so that I can say:
<ul>
<% @keywords.each do |keyword| %>
<li><%= "(#{keyword.number_of_studies}) #{keyword.title}") %></li>
<% end %>
</ul>
I'm sure this is possible, the question is: how?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用计数器缓存。这会在父对象上保留一个整数值以及子对象的数量。 ActiveRecord 会进行跟踪。
如果您确实必须使用一个没有计数器缓存的查询:
如您所见,这很快就会变得丑陋。最好坚持使用计数器缓存,或者执行两个单独的查询。
You could use the counter cache. This keeps an integer value on the parent object with the number of children. ActiveRecord keeps track.
If you really must use one query without the counter cache:
As you can see, this gets ugly fast. It's better to stick with the counter cache, or do two separate queries.