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.