我有一个Post模型,它有很多评级,我想把每个帖子的平均评级数据存储在Post ratings db列中。我在帖子模型上有一个计数器缓存,它统计评分的数量。
我的post.rb 中有以下代码
def update_rating
if self.ratings_count_changed?
self.rating = self.ratings.average(:rating)
end
end
我把它作为before_save回调,所以每当编辑和保存帖子时,它都会更新评分,这不是很有用。
有没有一种方法可以在创建新评级时调用此方法?
接近目标的一种方法是将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
您是否考虑将平均评级存储在评级模型中而不是后模型中?在这种情况下,您不需要任何回调,并且需要在更改后通过第一个请求重新计算平均值。
不要在帖子上保存before_save,而是在评级上创建after_create,因为听起来你需要在创建新评级时更新评级分数,而不是在帖子保存之前。
如何将其放入评级模型:
after_create :update_post_average_rating
def update_post_average_rating
self.post.rating = #....
end