8

有没有办法在一个before_destroy钩子中检查调用了什么对象(类)destroy

在下面的示例中,当 apatient被销毁时,它们的也被销毁appointments(这就是我想要的);physician但是,如果有任何appointments关联,我不想让 a被销毁physician

before_destory同样,有没有办法在回调中进行这样的检查?如果没有,有没有其他方法可以根据调用的“方向”(即根据谁调用)来完成这个“破坏检查”?

class Physician < ActiveRecord::Base
  has_many :appointments, dependent: :destroy
  has_many :patients, through: :appointments
end


class Patient < ActiveRecord::Base
  has_many :appointments, dependent: :destroy
  has_many :physicians, through: :appointments
end


class Appointment < ActiveRecord::Base
  belongs_to :patient
  belongs_to :physician

  before_destroy :ensure_not_referenced_by_anything_important

  private

  def ensure_not_referenced_by_anything_important
    unless patients.empty?
      errors.add(:base, 'This physician cannot be deleted because appointments exist.')
      false
    end
  end
end
4

2 回答 2

21

请注意,dependent: :destroyhas_many :through关系上只删除关联而不删除关联记录(即连接记录将被删除,但关联记录不会)。所以如果你删除 apatient它只会删除appointment而不是physician. 阅读API 文档中的详细说明。

我已经粘贴了下面的相关段落。

什么会被删除?

这里有一个潜在的陷阱:关联在连接表中具有记录,has_and_belongs_to_many以及has_many :through关联的记录。那么当我们调用其中一种删除方法时,究竟应该删除什么?

答案是假设删除关联是关于删除所有者和关联对象之间的链接,而不是关联对象本身。因此,使用has_and_belongs_to_manyand has_many :through,连接记录将被删除,但关联记录不会。

如果您考虑一下,这是有道理的:如果您要调用post.tags.delete(Tag.find_by_name('food')),您会希望food标签与 取消链接post,而不是从数据库中删除标签本身。

于 2013-02-24T07:37:56.127 回答
11

说啊:

class Physician < ActiveRecord::Base
  has_many :appointments, dependent: :restrict_with_exception
  has_many :patients, through: :appointments
end

注意dependent: :restrict_with_exception. 这将导致 Active Record 拒绝销毁任何具有相关约会记录的医师记录。

请参阅API 文档关联基础指南

于 2012-04-06T08:28:39.153 回答