Don't delete your records, move them to a different table.
Like acts_as_paranoid
, but doesn't mess with your SQL queries.
This gem is intended to work with ActiveRecord version 3.0.0 and later.
Gemfile:
gem 'acts_as_archive', :git => 'http://github.com/xxx/acts_as_archive.git'
Add acts_as_archive
to your models:
class Article < ActiveRecord::Base
acts_as_archive
end
Add this line to a migration:
ActsAsArchive.update Article, Comment
Replace Article, Comment
with your own models that use acts_as_archive
Archive tables mirror your table's structure, but with an additional deleted_at
column.
There is an alternate way to create archive tables if you don't like migrations.
Use destroy
and destroy_all
like you normally would.
Records move into the archive table instead of being destroyed.
NOTE: delete!
and delete_all
bypass acts_as_archive (like any model callbacks, by design). Using these methods will not move your records into the archive table.
New migrations are automatically applied to the archive table.
No action is necessary on your part.
Add ::Archive
to your ActiveRecord class:
Article::Archive.find(:first)
Use restore_all
to copy archived records back to your table:
Article.restore_all([ 'id = ?', 1 ])
If you previously used acts_as_paranoid
, the ActsAsArchive.update
call will automatically move your deleted records to the archive table
(see Create archive tables).
Original deleted_at
values are preserved.
To keep insertions fast, there are no indexes on your archive table by default.
If you are querying your archive a lot, you will want to add indexes:
class Article < ActiveRecord::Base
acts_as_archive :indexes => [ :id, :created_at, :deleted_at ]
end
Call ActsAsArchive.update
upon adding new indexes
(see Create archive tables).
To destroy a record without archiving:
article.delete!
To delete multiple records without archiving:
Article.delete_all!(["id in (?)", [1,2,3]])