Mover ===== Move ActiveRecord records across tables like it ain't no thang. Requirements ------------
sudo gem install mover
Move records ------------ Move the last article:
Article.last.move_to(ArticleArchive)
Move today's articles:
Article.move_to(
  ArticleArchive,
  :conditions => [ "created_at > ?", Date.today ]
)
The two tables do not have to be identical. Only shared columns transfer. If a primary key collision occurs, the destination record is updated. Callbacks --------- In this example, we want an "archive" table for articles and comments. We also want the article's comments to be archived when the article is.
class Article < ActiveRecord::Base
  has_many :comments
  before_move :ArticleArchive do
    comments.each { |c| c.move_to(CommentArchive) }
  end
end

class ArticleArchive < ActiveRecord::Base
  has_many :comments, :class_name => 'CommentArchive', :foreign_key => 'article_id'
  before_move :Article do
    comments.each { |c| c.move_to(Comment) }
  end
end

class Comment < ActiveRecord::Base
  belongs_to :article
end

class CommentArchive < ActiveRecord::Base
  belongs_to :article, :class_name => 'ArticleArchive', :foreign_key => 'article_id'
end
The after\_move callback is also available. Magic column ------------ If a table contains a moved_at column, it will magically populate with the date and time it was moved. Options ------- There are other options, in addition to conditions:
Article.move_to(
  ArticleArchive,
  :copy => true,          # Do not delete Article after move
  :generic => true,       # UPDATE using a JOIN instead of ON DUPLICATE KEY UPDATE (default on non-MySQL engines)
  :magic => 'updated_at', # Custom magic column
  :quick => true          # You are certain only INSERTs are necessary, no primary key collisions possible
                          # May only be a little faster on MySQL, but dramatically faster on other engines
)
You can access these options from callbacks using move_options. Reserve a spot -------------- Before you create a record, you can "reserve a spot" on a table that you will move the record to later.
archive = ArticleArchive.new
archive.id = Article.reserve_id
archive.save