10

在rails 3中,我知道我可以强制删除依赖对象在belongs_to和has_many关系中使用:dependent =>:delete选项。但是我想知道,什么是Rails 3的默认值:依赖于has_many和belongs_to

是什么,如果我不指定默认行为:依赖=> ...

干杯, 哈乔

+1

如果不指定这一点,你会被遗弃的孩子哭着要父母结束了。这不是什么大不了的事情,但它会让数据库充满(无用的)数据 – apneadiving

回答

16

虽然没有在documentation中所说,默认行为是对关联对象不做任何事情。也就是说,删除或销毁对象不会删除或销毁它所属或拥有的许多对象。

+0

感谢您指出:)我期望rails会尝试使用数据库查询加载相关对象,如果它们的ID字段未被正确无效。这意味着,浪费CPU和DB时间来搜索不存在的记录。所以我想知道为什么Rails在默认情况下没有对它做任何事情...... – fxtentacle

6

has_many使用:nullify策略,它将设置外部为空。对于has_many:通过它将使用delete_all。

对于has_many,destroy将始终调用要删除的 记录的销毁方法,以便执行回调。但删除将根据 指定的策略执行删除操作:依赖选项,或者如果没有:依赖选项,则会按照默认策略 执行删除操作。默认策略是:nullify(将 外键设置为零),但has_many:through除外,其中默认的 策略为delete_all(删除连接记录,不运行其 回调)。

- ActiveRecord::Associations::ClassMethods

belongs_to的不知道到底是什么,而不是能够找到的文档任何东西。我会尽力做一些挖掘并更新答案。

+6

你确定这仍然是这样吗?我刚刚经历了默认行为不是为了取消外键。我必须明确设置'dependent::nullify'来使其无效。我使用的是Ruby 2.0.0和Rails 4.0.0。 – Magne

3

在Rails 3中,缺省:dependent值是:nullify,它将外键设置为零。

默认策略是:nullify常规has_many。此外,如果源反射是belongs_to,则这仅适用于所有情况。

来源:http://guides.rubyonrails.org/3_1_release_notes.html#active-record

这仍然是在Rails中4

然而deletedelete_all的情况下,根据由:dependent选项,或者指定的策略要么做不删除:dependent选项给出,那么它将遵循默认策略。默认策略是:nullify(将外键设置为nil),但has_many :through除外,默认策略为delete_all(删除连接记录,不运行其回调)。

来源:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy%3F

也看到源代码文档:https://github.com/rails/rails/blob/b5a8fd7bb4a6fa4b67d4eabae4cea2cb1834d8d9/activerecord/lib/active_record/associations/collection_proxy.rb#L369

+0

不幸的是,这是不正确的。引用的文档是指在has_many关联(如'blog.posts.delete_all')上调用delete/delete_all。在模型上调用'blog.destroy'而不是在关系上 - 除非has_many关系指定了'dependent'行为,否则对相关模型根本不会做任何事情。 (默认是留下悬挂引用) – gmcnaughton

相关问题