Я бы начал с этого, пока производительность не стала проблемой:
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