If it is a bug please open an issue on GitHub.
Add the destroyed_at
gem to your Gemfile
gem 'destroyed_at'
You can either mixin the modules on a case-by-case basis:
class User < ActiveRecord::Base
include DestroyedAt
end
or make the changes globally:
class ActiveRecord::Base
include DestroyedAt
end
Please note you will need to make a migration
Each model's table that is expected to have this behavior must have
a destroyed_at
column of type DateTime
.
Allows you to "destroy" an object without deleting the record or associated records.
Overides #destroy
to set #destroyed_at
to the current time on an object. The
default scope of the class is then set to return objects that have not
been destroyed (i.e., have nil
for their destroyed_at value).
#destroyed?
will be true
when your model is destroyed; it will be
false
when your model has been restored.
class User < ActiveRecord::Base
include DestroyedAt
end
user = User.create
user.destroy
# => true
user.destroyed_at
# => <DateTime>
When you'd like to "restore" a record, call the #restore
method on
the instance. This will set its #destroyed_at
value to nil
, thereby
including it in the default scope of the class again.
To include this functionality on has_many through
relationships,
be sure to include DestroyedAt
on the through model, as well as the
parent model.
class User < ActiveRecord::Base
include DestroyedAt
end
user = User.create
user.destroy
user.restore
# => true
user.destroyed_at
# => nil
before_restore
and after_restore
callbacks are added to your
model. They work similarly to the before_destroy
and after_destroy
callbacks.
class User < ActiveRecord::Base
before_restore :before_restore_action
after_restore :after_restore_action
private
def before_restore_action
...
end
def after_restore_action
...
end
end
If you are using the uniqueness
validator you will need to run it as:
validates :email, uniqueness: { conditions: -> { where(destroyed_at: nil) } }
Rails will by default not include default_scopes when querying for uniqueness. Rather than monkey patching the validator we believe this is the best solution.
We are very thankful for the many contributors
This gem follows Semantic Versioning
Please do! We are always looking to improve this gem. Please see our Contribution Guidelines on how to properly submit issues and pull requests.
DockYard, LLC © 2013