Ruby on Rails:如何在数据库中总结这些元素?

Jus*_*zer 2 ruby database ruby-on-rails ruby-on-rails-3

我有一个video_votes表,其中所有的投票都有一个名为value的列设置为1或-1.我想总结视频投票的所有价值并显示净投票数.首先,我应该如何总结,其次,我应该将这个值存储在我的视频表中吗?如果是这样,怎么样?

Ala*_*ody 7

我会从这开始,直到性能成为一个问题:

class Video < AR::Base
  has_many :video_votes

  def vote_sum
    video_votes.sum(:value)
  end
end

class VideoVote < AR::Base
  belongs_to :video
  validates_inclusion_of :value, :in => [-1,1]
end
Run Code Online (Sandbox Code Playgroud)

一旦性能成为一个问题,我想缓存总和值,我可能会做这样的事情:

class Video < AR::Base
  has_many :video_votes

  # Override vote_sum attribute to get the db count if not stored in the db yet. 
  # The alternative is that you could remove this method and have the field
  # populated by a migration.
  def vote_sum
    read_attribute(:vote_sum) || video_votes.sum(:value)
  end
end

class VideoVote < AR::Base
  belongs_to :video
  validates_inclusion_of :value, :in => [-1,1]

  after_create :update_video_vote_sum

private

  def update_video_vote_sum
    video.update_attributes(:vote_sum => video.vote_sum + value)
  end
end
Run Code Online (Sandbox Code Playgroud)

查看关于"覆盖默认访问者"的AR文档(向下滚动一下) http://ar.rubyonrails.org/classes/ActiveRecord/Base.html

  • 从技术上讲,我不应该继续使用缓存,因为它增加了额外的复杂性.如果投票可以改变,则可以删除投票,使得缓存的值保持同步变得更复杂.但如果情况并非如此,而且你知道你会有很多选票和很多观点,那么它可能是值得的.但要注意过早优化:做实际上从未需要的努力.只需记住它实际需要的时间. (2认同)