我有以下关系模型:
class Doctor
has_many :appointmets
# has attribute 'average_rating' (float)
end
class Appointment
belongs_to :doctor
# has_attribute 'rating' integer
end
我想设置一个回调来设置doctor.average_rating
每次约会被评分,即每次rating
约会表上的列被触及。
我试过这个:
class Appointment
after_update :update_dentist_average_rating, if: :rating_changed?
# also tried with after_save
private
def update_dentist_average_rating
ratings = Appointment.where(dentist_id: dentist.id).map(&:rating)
doctor.average_rating = ratings.reduce(:+) / ratings.size if ratings.any?
doctor.save
end
end
但不起作用,总是appointment.dentist.average_rating
返回nil
。我似乎无法测试回调是否正在运行appointment.save
。我错过了什么?
编辑:这是应用程序流程
- 一个用户(Patient 类)保存了一个评分为 nil 和一些医生 ID 的约会。
- 如果约会日期已经过去,可以通过 '' 在表单上编辑或设置约会时间。
- 然后我需要更新约会.doctor.average_rating