在rails 3中,我知道我可以强制删除依赖对象在belongs_to和has_many关系中使用:dependent =>:delete选项。但是我想知道,什么是Rails 3的默认值:依赖于has_many和belongs_to
是什么,如果我不指定默认行为:依赖=> ...
干杯, 哈乔
在rails 3中,我知道我可以强制删除依赖对象在belongs_to和has_many关系中使用:dependent =>:delete选项。但是我想知道,什么是Rails 3的默认值:依赖于has_many和belongs_to
是什么,如果我不指定默认行为:依赖=> ...
干杯, 哈乔
虽然没有在documentation中所说,默认行为是对关联对象不做任何事情。也就是说,删除或销毁对象不会删除或销毁它所属或拥有的许多对象。
感谢您指出:)我期望rails会尝试使用数据库查询加载相关对象,如果它们的ID字段未被正确无效。这意味着,浪费CPU和DB时间来搜索不存在的记录。所以我想知道为什么Rails在默认情况下没有对它做任何事情...... – fxtentacle
has_many使用:nullify策略,它将设置外部为空。对于has_many:通过它将使用delete_all。
对于has_many,destroy将始终调用要删除的 记录的销毁方法,以便执行回调。但删除将根据 指定的策略执行删除操作:依赖选项,或者如果没有:依赖选项,则会按照默认策略 执行删除操作。默认策略是:nullify(将 外键设置为零),但has_many:through除外,其中默认的 策略为delete_all(删除连接记录,不运行其 回调)。
- ActiveRecord::Associations::ClassMethods
belongs_to的不知道到底是什么,而不是能够找到的文档任何东西。我会尽力做一些挖掘并更新答案。
你确定这仍然是这样吗?我刚刚经历了默认行为不是为了取消外键。我必须明确设置'dependent::nullify'来使其无效。我使用的是Ruby 2.0.0和Rails 4.0.0。 – Magne
在Rails 3中,缺省:dependent
值是:nullify
,它将外键设置为零。
默认策略是
:nullify
常规has_many
。此外,如果源反射是belongs_to
,则这仅适用于所有情况。
来源:http://guides.rubyonrails.org/3_1_release_notes.html#active-record
这仍然是在Rails中4
然而
delete
和delete_all
的情况下,根据由:dependent
选项,或者指定的策略要么做不删除:dependent
选项给出,那么它将遵循默认策略。默认策略是:nullify
(将外键设置为nil
),但has_many :through
除外,默认策略为delete_all
(删除连接记录,不运行其回调)。
不幸的是,这是不正确的。引用的文档是指在has_many关联(如'blog.posts.delete_all')上调用delete/delete_all。在模型上调用'blog.destroy'而不是在关系上 - 除非has_many关系指定了'dependent'行为,否则对相关模型根本不会做任何事情。 (默认是留下悬挂引用) – gmcnaughton
如果不指定这一点,你会被遗弃的孩子哭着要父母结束了。这不是什么大不了的事情,但它会让数据库充满(无用的)数据 – apneadiving