Mover ===== Move ActiveRecord records across tables like it ain't no thang. Requirements ------------
sudo gem install moverMove 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' endThe
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