21

我正在使用 Rails 多态关联,这样一些模型有很多cash_histories孩子,就像这样:

has_many :cash_histories, as: :cashable

但是,当我尝试从 parent 删除所有现金历史记录时@resource,如下所示:

@resource.cash_histories.delete_all

我收到以下查询:

UPDATE "cash_histories" SET "cashable_id" = NULL WHERE "cash_histories"."cashable_id" = $1 AND "cash_histories"."cashable_type" = $2  [["cashable_id", 1], ["cashable_type", "ServiceOrder"]]

我无法理解这种行为,将关系 id 设置为 null 而不是删除,这将导致我的表中出现死行。为什么会这样?

我正在使用 Rails 4.1。

4

2 回答 2

39

来自 Rails API 文档delete_all

从集合中删除所有记录。对于 has_many 关联,删除是根据 :dependent 选项指定的策略完成的。返回包含已删除记录的数组。

如果没有给出 :dependent 选项,那么它将遵循默认策略。默认策略是:nullify。这会将外键设置为 NULL。对于 has_many :through,默认策略是 delete_all。

因此,您只需将您的:dependent选项设置has_many:delete_allor :destroy,具体取决于您想要的行为。

has_many :cash_histories, as: :cashable, dependent: :delete_all

来自 Rails API 文档has_many

如果对象与dependent: :destroy 相关联,则对象将被另外销毁,如果与dependent: :delete_all 相关联,则将被删除。

于 2014-05-27T01:49:50.113 回答
2

它仍然很奇怪,因为在其他任何地方它总是描述所有者被摧毁时会发生什么。

控制关联对象在其所有者被销毁时发生的情况:

:destroy 导致关联的对象也被销毁。

:delete_all 导致关联对象直接从数据库中删除(不执行回调)。

:nullify 导致外键设置为 NULL(不执行回调)。

:restrict_with_exception 如果存在关联记录,则会引发异常。

:restrict_with_error 如果存在关联对象,则会将错误添加到所有者。

于 2016-10-13T10:42:11.853 回答