If you didn’t know it yet, paranoia is a gem that handles the soft deletion for your ActiveRecord models.
Adding it to your model is straightforward. Given you want to add soft-deletion to your Client model, first run rails generate migration AddDeletedAtToClients deleted_at:datetime:index
to add the deleted_at
column in the clients
table. Then add acts_as_paranoid
to your Client model, like in the following snippet:
class Client < ActiveRecord::Base
acts_as_paranoid
end
From now on, Client#destroy
sets the current datetime in the deleted_at
column, while Client
default scope returns only records which have a nil value for deleted_at
.
To really destroy a client, you should use #really_destroy!
.
To list all clients (even the deleted ones) you can use Client.with_deleted
, while you can use Client.only_deleted
to get only deleted records.
Paranoia even follows relationships. So if you are in the following scenario:
class Client < ActiveRecord::Base
has_many :addresses, dependent: :destroy
acts_as_paranoid
end
class Address < ActiveRecord::Base
belongs_to :client
acts_as_paranoid
end
when you call Client#destroy
paranoia will soft-delete all its addresses.
The only problem I found after my setup was with the uniqueness validation. In this scenario:
class Client < ActiveRecord::Base
acts_as_paranoid
validates :name,
:uniqueness => true
end
the uniqueness validator will check among deleted records too, and in my case I did want to check only among not-deleted records.
For this purpose there is a gem called (paranoia_uniqueness_validator)[https://github.com/anthonator/paranoia_uniqueness_validator] that can be used this way:
class Client < ActiveRecord::Base
acts_as_paranoid
validates :name,
:uniqueness_without_deleted => true
end
And it works as expected.
So, easy soft-deletion for all 🙂
Leave a Reply