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: false on MySQL engines)
:magic => 'updated_at', # Custom magic column
:migrate => true, # Copies the original value of the 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