Rails 4关联验证销毁

时间:2015-09-08 23:05:45

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord simple-form

我有两个模型通过第三个模型进行多对多关联。 通过前:

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(约会)。

如何预防?我想在保存医生之前验证将被删除的所有约会,如果某些约会无法删除,则要向医生添加错误。

1 个答案:

答案 0 :(得分:3)

从导轨documentation

  

类似于挂钩到生命周期的正常回调   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