ActiveRecord delete_all方法更新而不是删除

Jir*_*ico 15 activerecord ruby-on-rails rails-activerecord ruby-on-rails-4.1

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

has_many :cash_histories, as: :cashable
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从父母那里删除所有现金历史时@resource,如下所示:

@resource.cash_histories.delete_all
Run Code Online (Sandbox Code Playgroud)

我得到以下查询:

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"]]
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Rails 4.1.

pdo*_*obb 28

来自Rails API文档delete_all:

删除集合中的所有记录.对于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
Run Code Online (Sandbox Code Playgroud)

来自Rails API文档has_many:

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