好吧,假设我有两种不同的型号:
因此,一项民意调查可以有很多选票。
目前我正在显示所有民意调查的清单,包括其整体vote_count。
@poll = Poll.update(params[:poll_id], :vote_count => vote_count+1)
@poll.vote_count
,它可以正常工作。 @vote_count = Poll.find(params[:poll_id]).votes.count
感谢您的帮助!
答案 0 :(得分:4)
您是否考虑过使用counter cache (see counter_cache option)? Rails具有内置功能,可以处理关联的所有可能更新以及这将如何影响计数器。
就像在关联的一对多方面(在您的情况下为Poll)的表上添加名为#{attribute.pluralize}_count
的0初始化整数列(在您的情况下为votes_count
)一样简单。
然后在关联的另一端将:counter_cache => true
参数添加到belongs to语句。
belongs_to :poll, :counter_cache => true
现在这不能完全回答您的问题,正确的答案取决于数据的形状和您配置的索引。如果您期望您的投票表数量在数千个民意调查中分布数百万,那么请使用计数器缓存,否则只计算关联应该没问题。
答案 1 :(得分:1)
这是一个很好的问题,因为它涉及存储摘要和汇总信息的基本问题。
通常这不是一个好主意,因为随着系统的发展,事情很容易变得不同步。
有时候您确实需要摘要信息,但这些是更专业的情况,例如只用于报告的读取打开数据库,并且每天午夜更新一次。
在这些情况下,汇总汇总报告不仅可以,而且优于重复的汇总/汇总信息计算,否则将对每个查询进行。这也将取决于使用和尺寸,例如如果每天有300个查询(每天更新一次,只读数据库)并且它们都必须计算相同的总数,并且每个查询读取20,000行,这样做一次并存储该计算会更有效。随着数据和查询的增长,这可能是允许复杂报告的唯一实用方法。
答案 2 :(得分:0)
对我而言,在如此简单的情况下,在民意调查中使用vote_count并没有多大意义。计数行真的很快,如果你添加一个投票而忘记增加vote_count,那么数据有点破...