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相关联,则会被删除.