Answers:
在Rails的模型关联上,您可以指定:dependent
选项,该选项可以采用以下三种形式之一:
:destroy/:destroy_all
通过调用其destroy
方法将关联对象与此对象一起销毁:delete/:delete_all
所有关联的对象将立即销毁,而无需调用其:destroy
方法:nullify
所有关联对象的外键都设置为NULL
不调用其save
回调:restrict
。如果设置为:restrict,则如果该对象具有任何关联的对象,则无法删除。
:delete
或:destroy_all
选择吗?:depend选项期望:destroy,:delete_all,:nullify或:restrict(:delete)
:delete
并且:destroy_all
选项不存在。但是,在模型上有被调用的类方法delete
,destroy_all
因此这可能是造成混淆的原因。
请参阅destroy删除其关联的元素 ,其中delete_all可以从self表中删除多个数据,如下所示:DELETE * FROM table where field = 'xyz'
:取决于可能的选项:
控制销毁所有者时关联对象发生的情况。请注意,这些被实现为回调,并且Rails按顺序执行回调。因此,其他类似的回调可能会影响:depend行为,并且该:dependent
行为可能会影响其他回调。
:destroy
导致所有关联的对象也被破坏。
:delete_all
使所有关联的对象直接从数据库中删除(因此将不执行回调)。
:nullify
导致将外键设置为NULL。不执行回调。
:restrict_with_exception
如果存在任何关联的记录,则会引发异常。
:restrict_with_error
如果存在任何关联的对象,则会导致将错误添加到所有者。
如果与该:through
选项一起使用,则联接模型上的关联必须是belongs_to,并且被删除的记录是联接记录,而不是关联的记录。
实际上,主要区别在于:delete_all
使用时不会调用任何回调。但是,使用时,将触发:destroy
回调堆栈(:after_destroy
,:after_commit
...)。
因此,如果touch:
在删除的模型中有ing声明,则最好使用dependent: :delete_all
“ Dependent :: destroy”。