The best way to delete a collection on a specified condition

19 views
Skip to first unread message

Serguei Cambour

unread,
Aug 6, 2016, 1:10:01 PM8/6/16
to Ruby on Rails: Talk
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.

Colin Law

unread,
Aug 6, 2016, 4:37:57 PM8/6/16
to Ruby on Rails: Talk
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

>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to rubyonrails-ta...@googlegroups.com.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/rubyonrails-talk/e72d40de-1f2b-494c-8e47-ff172c4cd817%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

Serguei Cambour

unread,
Aug 7, 2016, 5:53:26 AM8/7/16
to Ruby on Rails: Talk
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.

Serguei Cambour

unread,
Aug 7, 2016, 5:59:05 AM8/7/16
to Ruby on Rails: Talk
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.


On Saturday, 6 August 2016 19:10:01 UTC+2, Serguei Cambour wrote:
Reply all
Reply to author
Forward
0 new messages