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:
Or, if you like to live on the bleeding-edge:
gem "blamestamp", :git => "https://github.com/cavis/blamestamp"
In your migrations:
class CreateFoos < ActiveRecord::Migration def change create_table :foos do |t| t.string :bar t.blamestamps end end end
Or, if modifying an existing model:
class AddBlamestampsToFoos < ActiveRecord::Migration def up change_table :foos do |t| t.blamestamps end end def down drop_blamestamps :foos end end
In your model:
class Foo < ActiveRecord::Base blameable end
By default, blamestamps adds 4 columns to your models:
When a record is created,
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_by will be nil.
When a record is updated for the first time (and every time after),
blame_upd_by are modified. Again,
blame_upd_by will remain nil if there is no remote-user.
blameable adds 2 relations to your models:
These are standard
belongs_to associations, and will be nil unless the
_at column is populated.
If you want, you can manually set the blamestamps instead of letting the remote user set them. For example:
user1 = User.new foo1 = Foo.new foo1.blame_cre_user = user1 foo1.save! #whatever the remote user may have been, blame_cre_by is now user1.id
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
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
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_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] end
Or, just specify a single cascade:
class Foo < ActiveRecord::Base belongs_to :bar belongs_to :project blameable :cascade => :bar end
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.