ActiveRecord delete_all方法更新而不是删除

时间:2014-05-27 01:35:32

标签: ruby-on-rails activerecord rails-activerecord ruby-on-rails-4.1

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

has_many :cash_histories, as: :cashable

但是当我尝试从父@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。

2 个答案:

答案 0 :(得分:28)

来自delete_all的Rails API文档:

  

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

     

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

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

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

来自has_many的Rails API文档:

  

如果对象与dependent :: destroy相关联,则会被销毁,如果它们与dependent :: delete_all相关联,则会被删除。

答案 1 :(得分:2)

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

  

控制关联对象在其所有者身份时会发生什么   破坏:

     

:destroy导致相关对象也被破坏。

     

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

     

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

     

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

     

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