has_many通过关联依赖的破坏在谁叫毁灭的条件下

时间:2012-04-06 06:19:55

标签: ruby-on-rails associations destroy

有没有办法在before_destroy钩子内检查哪个对象(类)称为destroy

在以下示例中,当patient被销毁时,appointments也是如此(这就是我想要的);但是,如果physicianappointments相关联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 回调中进行此类检查?如果没有,是否还有其他方法可以实现这一目标&#34;销毁检查&#34;基于&#34;方向&#34;电话(即根据谁打电话)?

{{1}}

2 个答案:

答案 0 :(得分:18)

请注意,dependent: :destroy关系中的has_many :through仅删除关联,关联记录(即将删除联接记录,但相关记录不会)。因此,如果您删除patient,则只会删除appointment而不会删除physician。阅读the API docs中的详细说明。

我已粘贴以下相关段落。

什么被删除?

这里存在一个潜在的缺陷:has_and_belongs_to_manyhas_many :through关联在连接表中有记录,以及相关记录。那么当我们调用其中一种删除方法时,应该删除哪些内容?

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

如果您考虑一下,这是有道理的:如果您要致电post.tags.delete(Tag.find_by_name('food')),您希望将food代码与post取消关联,而不是标记自己从数据库中删除。

答案 1 :(得分:11)

请说:

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

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

请参阅the API docsthe association basics guide