3 ms·
Do you mean something like this? ids = Post.where(:published => true).pluck(:id) Post.where(:id => ids).delete_all or this Post.where(:published
by xentronium 14y ago
Do you mean something like this?
ids = Post.where(:published => true).pluck(:id)
Post.where(:id => ids).delete_all
or this
Post.where(:published => true).delete_all
?
- chris_wot 14y agoI looked up the API documentation for pluck... That definitely looks like what I'm talking about :-) Does the second query translate to a straight DELETE?
- rahoulb 14y agoYes - `delete from posts where published = 1;` (or however your particular database adapter translates true)
- janus 14y agoYou might want to use 'destroy' instead of 'delete', as 'delete' skips all ActiveRecord callbacks (i. e., if you had a dependent: :destroy callback for post comments, using 'delete' would leave them intact)
- xentronium 14y ago`destroy` instantiates active record models which kind of defeats the purpose of fast deletion :)
- janus 14y agoYou are right, well in that case, you would have to delete associated records manually if you didn't add any foreign keys at the db level
- chris_wot 14y agoI'd suggest deleting or dealing with those records anyway, regardless of whether you added FKs! But... if you don't add FKs, you've got bigger issues to deal with :(
- joevandyk 14y agothis is why i prefer using "on delete cascade" in schemas, no need to transmit lots of data over the wire and instantiate thousands of slow activerecord objects when deleting stuff.
- randomdata 14y agoThough you're still left to deal with your destroy callbacks/observers, if you have any.
- sanderjd 14y agoThe second variant seems much better to me - in the first variant the size of the DELETE query itself is proportional to the number of published posts, so for very large numbers of published posts you'll end up sending a lot of data over the network, and may even hit your max_allowed_packet size (though it defaults to 1GB, which would be a lot of published posts!).