或者,您可以完全避开Vote
表格并保留外部计数。
每次投票时,都会调用一个单独的计数类来保持对投票的持续计数。每天将有一个计数记录。计票记录将有一个整数表示当天的投票数。
对计数类的每次增量调用都会找到当前日期(今天)的计数记录,增加投票计数并保存记录。如果不存在记录,则会创建一个记录并相应地递增。
例如,让我们VoteTally
使用两个属性调用一个类:日期(日期)和投票计数(整数),没有时间戳,没有关联。这是模型的样子:
class VoteTally < ActiveRecord::Base
def self.tally_up!
find_or_create_by_date(Date.today).increment!(:votes)
end
def self.tally_down!
find_or_create_by_date(Date.today).decrement!(:votes)
end
def self.votes_on(date)
find_by_date(date).votes
end
end
然后,在Vote
模型中:
class Vote < ActiveRecord::Base
after_create :tally_up
after_destroy :tally_down
# ...
private
def tally_up ; VoteTally.tally_up! ; end
def tally_down ; VoteTally.tally_down! ; end
end
这些方法将获得投票计数:
VoteTally.votes_on Date.today
VoteTally.votes_on Date.yesterday
VoteTally.votes_on 3.days.ago
VoteTally.votes_on Date.parse("5/28/13")
当然,这是一个简单的示例,您必须对其进行调整以适应。这将导致在投票期间进行额外的查询,但它比where
没有索引的 100M 记录上的子句快得多。此解决方案可能会出现轻微的错误,但我认为鉴于每日计票的轶事性质,这是可以接受的。