The best way to delete a collection on a specified condition

I wonder what is the best way to delete all the records of the association on a specified condition. For example, you have User model that has many Post(s). How would keep all the recent User’s Posts and delete all the last Posts when a Users have more than 25 ?

There is a solution like that:

def self.delete_old_posts old_posts = users = includes(:post) users.each do |user| old_posts =+ user.posts.offset(25) unless user.posts.empty? end

old_posts.delete_all

end

``

Any other ideas ? Thank you.

I wonder what is the best way to delete all the records of the association on a specified condition. For example, you have User model that has many Post(s). How would keep all the recent User's Posts and delete all the last Posts when a Users have more than 25 ?

There is a solution like that:

def self.delete_old_posts     old_posts =     users = includes(:post)     users.each do |user|       old_posts =+ user.posts.offset(25) unless user.posts.empty?     end

    old_posts.delete_all end

Any other ideas ? Thank you.

You need to order the posts otherwise there is no guarantee which ones will be deleted. I don't think you need includes(:post). Also you don't need the unless. Are you sure you want delete_all? That will not call callbacks. In fact I am not sure you can use delete_all in this situation.

Colin

Thank you Colin. Yes, I know about callbacks, I don’t care about it in this case. I just want to clean posts and keep not more than the last 25 ones. Thank you for the tip regarding the ordering, I’ll take care about that.

Just one editing, - I had to use a plural form with includes as follows:

users = includes(:posts)

``

to have eager loading of posts association for every User.