# module ActiveRecord::Locking::Optimistic::ClassMethods

### Constants

DEFAULT_LOCKING_COLUMN

### Public Instance Methods

locking_column() click to toggle source

The version column used for optimistic locking. Defaults to `lock_version`.

    # File lib/active_record/locking/optimistic.rb, line 154
    def locking_column
      @locking_column = DEFAULT_LOCKING_COLUMN unless defined?(@locking_column)
      @locking_column
    end

locking_column=(value) click to toggle source

Set the column to use for optimistic locking. Defaults to `lock_version`.

    # File lib/active_record/locking/optimistic.rb, line 148
    def locking_column=(value)
      reload_schema_from_cache
      @locking_column = value.to_s
    end

locking_enabled?() click to toggle source

Returns true if the `lock_optimistically` flag is set to true (which it is, by default) and the table includes the `locking_column` column (defaults to `lock_version`).

    # File lib/active_record/locking/optimistic.rb, line 143
    def locking_enabled?
      lock_optimistically && columns_hash[locking_column]
    end

reset_locking_column() click to toggle source

Reset the column used for optimistic locking back to the `lock_version` default.

    # File lib/active_record/locking/optimistic.rb, line 160
    def reset_locking_column
      self.locking_column = DEFAULT_LOCKING_COLUMN
    end

update_counters(id, counters) click to toggle source

Make sure the lock version column gets updated when counters are updated.

Calls superclass method

    # File lib/active_record/locking/optimistic.rb, line 166
    def update_counters(id, counters)
      counters = counters.merge(locking_column => 1) if locking_enabled?
      super
    end

### Private Instance Methods

inherited(subclass) click to toggle source

We need to apply this decorator here, rather than on module inclusion. The closure created by the matcher would otherwise evaluate for `ActiveRecord::Base`, not the sub class being decorated. As such, changes to `lock_optimistically`, or `locking_column` would not be picked up.

Calls superclass method

    # File lib/active_record/locking/optimistic.rb, line 177
    def inherited(subclass)
      subclass.class_eval do
        is_lock_column = ->(name, _) { lock_optimistically && name == locking_column }
        decorate_matching_attribute_types(is_lock_column, :_optimistic_locking) do |type|
          LockingType.new(type)
        end
      end
      super
    end