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

最佳答案

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

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

一旦性能成为问题,我想缓存汇总值,我可能会这样做:
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

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

关于ruby-on-rails - Ruby on Rails:如何总结数据库中的这些元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5347378/

10-10 21:16