Ruby gem to provide basic, predictable auditing for ActiveRecords
Ruby JavaScript
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Blamestamp is intended as an easy way to record the creating and latest-editing user for an Active Record. It works similarly to the built-in Active Record timestamps module, but in a more configurable and predictable manner. Column names are configurable, as are default values, in case you allow non logged-in users to edit some things. Additionally, it allows configuration of when editing a record will update the blamestamps on a related record.


Ruby and Rails

Requires Ruby version >= 1.9.2 and Rails version >= 3.0

Current version limitations

Currently only works with a combination of Devise, ActiveRecord and ActiveController.


Blamestamp should be installed as a gem in your app.

Include the gem in your Gemfile:

gem "blamestamp"

Or, if you like to live on the bleeding-edge:

gem "blamestamp", :git => ""

Getting Started

In your migrations:

class CreateFoos < ActiveRecord::Migration
  def change
    create_table :foos do |t|
      t.string :bar

Or, if modifying an existing model:

class AddBlamestampsToFoos < ActiveRecord::Migration
  def up
    change_table :foos do |t|
  def down
    drop_blamestamps :foos

In your model:

class Foo < ActiveRecord::Base


By default, blamestamps adds 4 columns to your models:

  • blame_cre_at
  • blame_upd_at
  • blame_cre_by
  • blame_upd_by

When a record is created, blame_cre_at and blame_cre_by will be set. If no remote-user is logged in (via a controller), blame_cre_by will be nil. On initial creation, both blame_upd_at and blame_upd_by will be nil.

When a record is updated for the first time (and every time after), blame_upd_at and blame_upd_by are modified. Again, blame_upd_by will remain nil if there is no remote-user.

Additionally, blameable adds 2 relations to your models:

  • blame_cre_user
  • blame_upd_user

These are standard belongs_to associations, and will be nil unless the _at column is populated.

Overriding Stamps

If you want, you can manually set the blamestamps instead of letting the remote user set them. For example:

user1 =
foo1 =
foo1.blame_cre_user = user1!
#whatever the remote user may have been, blame_cre_by is now

Advanced Options

If that's not enough for you, there are several advanced config options available.

In your migrations:

If you don't like the blame prefix on the columns, you can change it. In this example it will create columns blah_cre_at, blah_upd_at, blah_cre_by, and blah_upd_by.

t.blamestamps :prefix => :blah

In your model:

If you changed the prefix of the columns in your migration, you should let the model know about that too:

blameable :prefix => :blah

Or, if you picked something completely off-the-wall in your migration, you can specify each of the 4 columns individually:

blameable :cre_at => :made_at, :upd_at => :changed_at, :cre_by => :invented_by, :upd_by => :hacked_by

And if you don't like the default association names, you can define those too:

blameable :cre_user => :inventor, :upd_user => :hacker

If you're concerned about data validation, you can make sure errors are raised if a record is ever saved with a blank blame_cre_by:

blameable :required => true

Finally, you can cascade modifications from a blameable model to one of its associations. Whenever a record of the blameable class is inserted, updated, or deleted, the upd_at/upd_by columns on the associated record will be updated. For example:

class Foo < ActiveRecord::Base
  belongs_to :bar
  belongs_to :project
  blameable :cascade => [:project, :bar]

Or, just specify a single cascade:

class Foo < ActiveRecord::Base
  belongs_to :bar
  belongs_to :project
  blameable :cascade => :bar

Issues and Contributing

Please, let me know about any bugs/feature-requests via the issues tracker. And if you'd like to contribute, send me a note! Thanks.


Blamestamp is free software, and may be redistributed under the MIT-LICENSE.