有没有办法在before_destroy
钩子内检查哪个对象(类)称为destroy
?
在以下示例中,当patient
被销毁时,appointments
也是如此(这就是我想要的);但是,如果physician
与appointments
相关联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}}
答案 0 :(得分:18)
请注意,dependent: :destroy
关系中的has_many :through
仅删除关联,不关联记录(即将删除联接记录,但相关记录不会)。因此,如果您删除patient
,则只会删除appointment
而不会删除physician
。阅读the API docs中的详细说明。
我已粘贴以下相关段落。
什么被删除?
这里存在一个潜在的缺陷:has_and_belongs_to_many
和has_many :through
关联在连接表中有记录,以及相关记录。那么当我们调用其中一种删除方法时,应该删除哪些内容?
答案是假设关联上的删除是关于删除所有者和关联对象之间的链接,而不是关联对象本身。因此,对于has_and_belongs_to_many
和has_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拒绝销毁任何具有相关约会记录的医生记录。