Rails - 基于子项的父值的平均计算

时间:2017-01-18 20:53:39

标签: ruby-on-rails

预订模型has_many评分,具有overall属性。

我希望每次添加/销毁评级时都会更新Book的{​​{1}}属性。

最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用模型生命周期挂钩,值得注意的是after_create

在您的评分模型中,您可以编写一个更新mean_rating

的创建后钩子
#models/rating.rb

after_create :update_book_mean_rating

def update_book_mean_rating
  new_mean_rating = self.book.ratings.sum(:overall) / self.book.ratings.count
  self.book.update_attributes(mean_rating: new_mean_rating
end

你可能想要添加验证/检查,以确保评级总是有书等,并在销毁时做类似的事情,但这样的事情应该指向正确的方向

答案 1 :(得分:1)

最简单的方法(非线程安全)是在 from django.conf.urls import url from intranet import views urlpatterns = [ url(r'^$', views.LoginFormView.as_view(), name='login'), url(r'^registreer$', views.UserFormView.as_view(), name='registreer')] 模型中使用after_create/after_destroy回调。见documentation on model callbacks

如果您需要线程安全解决方案,则需要在延迟作业中更新Rating或其他内容。 This post可能是一个好的开始