Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails delete_all is not deleting

I have a rails 3.2.8 app with the following models: Profile and Report. Profile has many Reports, and of Reports belong to a Profile

If I try to delete_all of the reports for a specific profile:

Profile.first.reports.delete_all

Instead of deleting the reports, it just sets their profile_id to nil using SQL similar to:

UPDATE `reports` SET `profile_id` = NULL WHERE `reports`.`profile_id` = 1 AND `reports`.`id` IN (1, 3)

I can't find anything about this in the guides, is this the correct behaviour? And if not what would cause it?

It's worth noting that using destroy_all works normally, as does using destroy and delete on a singular Report.

Edit (as I can't answer my own question yet):

Changing the relationship of the profile from:

has_many :reports

to:

has_many :reports, dependent: :delete_all

has fixed this, I'm guessing if you don't specify depending, it defaults to :nullify, and calling Profile.first.reports.delete_all doesn't actually delete, it instead does what ever is specified in dependant.

Unless I'm missing something this behaviour is undocumented, but at least it works as I expect now.

like image 381
Matt Bearman Avatar asked Nov 20 '13 11:11

Matt Bearman


1 Answers

If you have defined the association between profile and reports then your code should work else you can try

Report.where(:profile_id => Profile.first.id).delete_all
like image 112
Sabyasachi Ghosh Avatar answered Nov 01 '22 20:11

Sabyasachi Ghosh