2

我有以下关系模型:

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我错过了什么?

编辑:这是应用程序流程

  1. 一个用户(Patient 类)保存了一个评分为 nil 和一些医生 ID 的约会。
  2. 如果约会日期已经过去,可以通过 '' 在表单上编辑或设置约会时间。
  3. 然后我需要更新约会.doctor.average_rating
4

1 回答 1

3

用这个回调实现了它,虽然我不知道这是否是最好的方法:

after_save if: :rating_changed? do |apt|
  ratings = Appointment.where(doctor_id: 10).map(&:rating)
  doctor.average_rating = ratings.reduce(:+) / ratings.size if ratings.any?
  doctor.save!
end
于 2013-02-07T15:27:55.210 回答