我有两个模型通过第三个模型进行多对多关联。 通过前:
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, through: :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
end
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, through: :appointments
end
使用simple_form我有这个复选框设置(医师表格):
...
= f.association :patients, as: :check_boxes
...
当我检查一些复选框时,保存导轨将在数据库中创建约会。
当我取消选中复选框时,rails会破坏一些未经检查的约会。
因此更新将是
physician.patient_ids = []
我想在删除前验证约会。例如,如果约会有一些警告,我想在保存医师表格时显示警告验证错误。
所以,我想,也许rails会在约会时调用destroy方法,并尝试:
class Appointment < ActiveRecord::Base
before_destroy :check_destroy
private
def check_destroy
raise 'you can not do it!'
end
Nope,rails刚刚从保存医生的数据库中删除了约会。
也许rails会使用delete方法吗?然后我尝试了这个:
class Appointment < ActiveRecord::Base
def delete
raise 'you can not do it!'
end
不,再说一次。
似乎只是直接从数据库删除了join-association(约会)。
如何预防?我想在保存医生之前验证将被删除的所有约会,如果某些约会无法删除,则要向医生添加错误。
答案 0 :(得分:3)
类似于挂钩到生命周期的正常回调 Active Record对象,您还可以定义触发的回调 向对象添加对象或从对象中删除对象时 集合。
文档示例
class Project
has_and_belongs_to_many :developers, after_add: :evaluate_velocity
def evaluate_velocity(developer)
...
end
end
所以在你的特定情况下试试
has_many :patients, through: :appointments, before_remove :check_remove