Skip to content

Instantly share code, notes, and snippets.

@grimen
Forked from technoweenie/gist:180517
Created September 13, 2009 14:48

Revisions

  1. @technoweenie technoweenie created this gist Sep 3, 2009.
    32 changes: 32 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,32 @@
    One other cause is your :dependent callbacks.

    class Blog < AR::Base
    has_many :posts, :dependent => :destroy
    end

    This will iterate through every post and call #destroy on it. Use :delete_all if you want to just issue a single delete query. HOWEVER, this won't hit your destroy callbacks on Post.

    class Blog < AR::Base
    has_many :posts
    after_destroy :purge_posts

    private
    def purge_posts
    # one step better, it only loads a page of posts and hits every post destroy callback
    posts.paginated_each { |p| p.destroy }

    # even better, but not very dry
    # cheating a bit w/ a denormalized Comment table,
    # but this is a blog comment and i'm pressed for time :)
    Comment.delete_all :blog_id => id
    Post.delete_all :blog_id => id
    end

    The solution I've been using for this is WillPaginate.

    # instantiate only 30 users at a time
    User.paginated_each do |user|
    user.do_some_stuff!
    end

    Keep in mind that using Sequel or DM won't make you immune to all these (though DM has a nice identity map that helps in a lot of cases).