Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ActiveRecord delete_all method updating instead of deleting

Tags:

I'm using Rails polymorphic associations, that way some models have many cash_histories children, like this:

has_many :cash_histories, as: :cashable 

But when I try to delete all cash histories from a parent @resource, like this:

@resource.cash_histories.delete_all 

I get the following query:

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"]] 

I can't understand this behavior, setting relationship id to null instead of removing, that will result in dead rows in my table. Why is that happening?

I'm using Rails 4.1.

like image 860
Jirico Avatar asked May 27 '14 01:05

Jirico


1 Answers

From the Rails API docs for delete_all:

Deletes all the records from the collection. For has_many associations, the deletion is done according to the strategy specified by the :dependent option. Returns an array with the deleted records.

If no :dependent option is given, then it will follow the default strategy. The default strategy is :nullify. This sets the foreign keys to NULL. For, has_many :through, the default strategy is delete_all.

So you you just need to set the :dependent option on your has_many to either :delete_all or :destroy, depending on what behavior you want.

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

From the Rails API docs for has_many:

Objects will be in addition destroyed if they're associated with dependent: :destroy, and deleted if they're associated with dependent: :delete_all.

like image 120
pdobb Avatar answered Oct 19 '22 14:10

pdobb