我有一个有很多评级的Post模型,我想在post rating db列中存储每个帖子的平均评分数字。我在帖子模型上有一个计数器缓存,用于计算评级数量。
我在post.rb中有以下代码
def update_rating
if self.ratings_count_changed?
self.rating = self.ratings.average(:rating)
end
end
我将此作为before_save回调,所以每当编辑和保存帖子时,它都会更新评级,不是很有用。
有没有一种方法可以在创建新评级时调用此方法?
答案 0 :(得分:1)
您是否考虑将平均评级存储在评级模型中而不是发布模型?在这种情况下,您不需要任何回调,并且您需要在更改后首先请求重新计算。
答案 1 :(得分:1)
在帖子上取代before_save,而不是对评级进行after_create,因为听起来您需要在创建新评级时更新该评分,而不是在保存帖子之前。
答案 2 :(得分:1)
更接近目标的一种方法是向after_create
模型添加Rating
回调:
class Rating < ActiveRecord::Base
belongs_to :post
# ...
after_create :update_post_average_rating
def update_post_average_rating
self.post.update_attributes(:rating => self.post.ratings.average(:rating))
end
end
甚至更多OO友好版本:
class Post < ActiveRecord::Base
has_many :ratings
# ...
def update_average_rating
update_attributes(:rating => self.ratings.average(:rating))
end
end
class Rating < ActiveRecord::Base
belongs_to :post
# ...
after_create :update_post_average_rating
def update_post_average_rating
self.post.update_average_rating
end
end
答案 3 :(得分:1)
如何将其纳入评级模型:
after_create :update_post_average_rating
def update_post_average_rating
self.post.rating = #....
end