Skip to content

mwalsher/destroyed_at

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DestroyedAt

Build Status Dependency Status Code Climate

Looking for help?

If it is a bug please open an issue on GitHub.

Installation

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.

Usage

Allows you to "destroy" an object without deleting the record or associated records.

Destroying

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>

Restoring

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

Callbacks

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

Validations

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.

Authors

We are very thankful for the many contributors

Versioning

This gem follows Semantic Versioning

Want to help?

Please do! We are always looking to improve this gem. Please see our Contribution Guidelines on how to properly submit issues and pull requests.

Legal

DockYard, LLC © 2013

@dockyard

Licensed under the MIT license

About

ActiveRecord Mixin for Safe Destroys

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Ruby 100.0%