Userstamps

Posted by Curtis Miller Curtis Miller

In my last article I talked about adding a deleted_at field to the migration timestamps method for use with acts_as_paranoid. One of the additional things I wanted to do was not only capture the timestamp information, but also the user information. This way, I can be really paranoid and see who did what when. To add userstamps, I did the following.

lib/userstamps.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
module ActiveRecord
  module Userstamp
    def self.included(base) #:nodoc:
      base.class_eval do
        alias_method_chain :create, :userstamps
        alias_method_chain :update, :userstamps

        def current_user
          Thread.current['user']
        end
      end
    end

  private
    def create_with_userstamps #:nodoc:
      user = current_user
      if not user.nil?
        write_attribute('created_by', user.id) if respond_to?(:created_by) and created_by.nil?
        write_attribute('updated_by', user.id) if respond_to?(:updated_by) and updated_by.nil?
      end
      create_without_userstamps
    end

    def update_with_userstamps #:nodoc:
      user = current_user
      write_attribute('updated_by', user.id) if respond_to?(:updated_by) and (not user.nil?)
      update_without_userstamps
    end
  end
end

config/environment.rb (add)

1
2
3
4
require 'userstamp'
ActiveRecord::Base.class_eval do
  include ActiveRecord::Userstamp
end


Velocity Labs

Need web application development, maintenance for your existing app, or a third party code review?

Velocity Labs can help.

Hire us!