Description
Audit activerecord models like a boss. Tested in rails 4.0 / 4.1 and ruby 1.9.3 / 2.0.0.
This project is heavily based in audited gem.
Espinita alternatives and similar gems
Based on the "Auditing" category.
Alternatively, view Espinita alternatives based on common mentions on social networks and blogs.
-
Audited
Audited (formerly acts_as_audited) is an ORM extension that logs all changes to your Rails models. -
ActsAsParanoid
ActiveRecord plugin allowing you to hide and restore records without actually deleting them. -
PermenantRecords
Rails Plugin - soft-delete your ActiveRecord records. It's like an explicit version of ActsAsParanoid
CodeRabbit: AI Code Reviews for Developers

* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of Espinita or a related project?
README
Espinita
Audits activerecord models like a boss
[Alt text](./espinita.jpg)
Audit activerecord models like a boss. Tested in rails 4.0 / 4.1 and ruby 1.9.3 / 2.0.0.
This project is heavily based in audited gem.
Installation
In your gemfile
gem "espinita"
In console
$ rake espinita:install:migrations
$ rake db:migrate
Usage
class Post < ActiveRecord::Base
auditable
end
@post.create(title: "an awesome blog post" )
Espinita will create an audit by default on creation , edition and destroy:
@post.audits.size #=> 1
Espinita provides options to include or exclude columns to trigger the creation of audit.
class Post < ActiveRecord::Base
auditable only: [:title] # except: [:some_column]
end
And lets you declare the callbacks you want for audit creation:
class Post < ActiveRecord::Base
auditable on: [:create] # on: [:create, :update]
end
You can find the audits records easily:
@post.audits.first #=> #<Espinita::Audit id: 1, auditable_id: 1, auditable_type: "Post", user_id: 1, user_type: "User", audited_changes: {"title"=>[nil, "MyString"], "created_at"=>[nil, 2013-10-30 15:50:14 UTC], "updated_at"=>[nil, 2013-10-30 15:50:14 UTC], "id"=>[nil, 1]}
Espinita will save the model changes in a serialized column called audited_changes:
@post.audits.first.audited_changes #=> {"title"=>[nil, "MyString"], "created_at"=>[nil, 2013-10-30 15:50:14 UTC], "updated_at"=>[nil, 2013-10-30 15:50:14 UTC], "id"=>[nil, 1]}
Espinita will detect the current user when records saved from rails controllers. By default Espinita uses current_user method but you can change it:
Espinita.current_user_method = :authenticated_user
History and Restoration
If you just want a summary of changes for a particular attribute or attributes of a model, you can use the history_from_audits_for
method.
my_model.history_from_audits_for(:name)
=> [{changes: {name: "Arglebargle"}, changed_at: 2015-05-13 15:28:22 -0700},
{changes: {name: "Baz"}, changed_at: 2014-05-13 15:28:22 -0700},
{changes: {name: "Foo"}, changed_at: 2013-05-13 15:28:22 -0700}]
You can also provide an array of attributes to get a single history for all of them.
my_model.history_from_audits_for([:name, :settings])
=> [{changes: {name: "Arglebargle", settings: "Waffles"}, changed_at: 2015-05-13 15:28:22 -0700},
{changes: {name: "Baz"}, changed_at: 2014-05-13 15:28:22 -0700}]
Sometimes it's useful to roll a record back to a particular point in time, such as if it was accidentally modified. For this, the restore_attributes!
method is provided.
As with history_from_audits_for
, this can be used with a single attribute or an array of attributes.
model.name
=> "Baz"
model.settings
=> ""
model.history_from_audits_for([:name, :settings])
=> [{:changes=>{:name=>"Baz", :settings=>""}, :changed_at=>2015-05-03 15:33:58 -0700},
{:changes=>{:name=>"Arglebargle", :settings=>"IHOP"}, :changed_at=>2015-03-24 15:33:58 -0700},
{:changes=>{:name=>"Walrus"}, :changed_at=>2014-05-13 15:33:58 -0700}]
model.restore_attributes!([:name, :settings], DateTime.now - 57.days)
=> true
model.name
=> "Walrus"
model.settings
=> "MyText"
The restore_attributes!
method returns true
if it makes a change to the model, or false
if there is no resulting change.
Note: this uses update_attributes()
to do the rollback, so it will skip validations, but will trigger any callbacks that you may have in place.