Module: ActiveRecord::Userstamp::Stampable::ClassMethods

Defined in:
lib/active_record/userstamp/stampable.rb

Instance Method Summary collapse

Instance Method Details

#stampable(options = {}) ⇒ Object

This method is automatically called on for all classes that inherit from ActiveRecord, but if you need to customize how the plug-in functions, this is the method to use. Here’s an example:

class Post < ActiveRecord::Base
  stampable :stamper_class_name => :person,
            :creator_attribute  => :create_user,
            :updater_attribute  => :update_user,
            :deleter_attribute  => :delete_user,
            :deleter            => true,
            :with_deleted       => true
end

The method will automatically setup all the associations, and create before_validation & before_destroy callbacks for doing the stamping.

By default, the deleter association and before filter are not defined unless you set the :deleter_attribute or set the :deleter option to true.

When using the new acts_as_paranoid gem (github.com/goncalossilva/rails3_acts_as_paranoid) the :with_deleted option can be used to setup the associations to return objects that have been soft deleted.



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/active_record/userstamp/stampable.rb', line 74

def stampable(options = {})
  compatability = ActiveRecord::Userstamp.compatibility_mode
  defaults  = {
    :stamper_class_name => :user,
    :creator_attribute  => (compatability ? :created_by : :creator_id),
    :updater_attribute  => (compatability ? :updated_by : :updater_id),
    :deleter_attribute  => (compatability ? :deleted_by : :deleter_id),
    :deleter            => options.has_key?(:deleter_attribute),
    :with_deleted       => false
  }.merge(options)

  self.stamper_class_name = defaults[:stamper_class_name].to_sym
  self.creator_attribute  = defaults[:creator_attribute].to_sym
  self.updater_attribute  = defaults[:updater_attribute].to_sym
  self.deleter_attribute  = defaults[:deleter_attribute].to_sym

  class_eval do
    klass = "::#{stamper_class_name.to_s.singularize.camelize}"

    if defaults[:with_deleted]
      belongs_to :creator, :class_name => klass, :foreign_key => creator_attribute, :with_deleted => true
      belongs_to :updater, :class_name => klass, :foreign_key => updater_attribute, :with_deleted => true
    else
      belongs_to :creator, :class_name => klass, :foreign_key => creator_attribute
      belongs_to :updater, :class_name => klass, :foreign_key => updater_attribute
    end

    before_validation :set_updater_attribute
    before_validation :set_creator_attribute, :on => :create
    before_save :set_updater_attribute
    before_save :set_creator_attribute, :on => :create

    if defaults[:deleter]
      if defaults[:with_deleted]
        belongs_to :deleter, :class_name => klass, :foreign_key => deleter_attribute, :with_deleted => true
      else
        belongs_to :deleter, :class_name => klass, :foreign_key => deleter_attribute
      end

      before_destroy :set_deleter_attribute

    end
  end
end

#stamper_classObject

:nodoc:



134
135
136
# File 'lib/active_record/userstamp/stampable.rb', line 134

def stamper_class #:nodoc:
  stamper_class_name.to_s.camelize.constantize rescue nil
end

#without_stampsObject

Temporarily allows you to turn stamping off. For example:

Post.without_stamps do
  post = Post.find(params[:id])
  post.update_attributes(params[:post])
  post.save
end


126
127
128
129
130
131
132
# File 'lib/active_record/userstamp/stampable.rb', line 126

def without_stamps
  original_value = self.record_userstamp
  self.record_userstamp = false
  yield
ensure
  self.record_userstamp = original_value
end