module NoBrainer::Document::Validation::Uniqueness

Attributes

locked_keys_for_uniqueness[RW]

Public Instance Methods

_lock_for_uniqueness_once(key) click to toggle source
# File lib/no_brainer/document/validation/uniqueness.rb, line 14
def _lock_for_uniqueness_once(key)
  @locked_keys_for_uniqueness ||= {}
  @locked_keys_for_uniqueness[key] ||= NoBrainer::Config.distributed_lock_class.new(key).tap(&:lock)
end
lock_unique_fields() click to toggle source
# File lib/no_brainer/document/validation/uniqueness.rb, line 24
def lock_unique_fields
  self.class.unique_validators
    .flat_map { |validator| validator.attributes.map { |attr| [attr, validator] } }
    .select { |f, validator| validator.should_validate_field?(self, f) }
    .map { |f, validator| [f, *validator.scope].map { |k| [k, _read_attribute(k)] } }
    .map { |params| self.class._uniqueness_key_name_from_params(params) }
    .sort.each { |key| _lock_for_uniqueness_once(key) }
end
save?(options={}) click to toggle source

XXX we don’t use read_attribute_for_validation, which goes through the user getters, but read internal attributes instead. It makes more sense.

Calls superclass method
# File lib/no_brainer/document/validation/uniqueness.rb, line 7
def save?(options={})
  lock_unique_fields
  super
ensure
  unlock_unique_fields
end
unlock_unique_fields() click to toggle source
# File lib/no_brainer/document/validation/uniqueness.rb, line 19
def unlock_unique_fields
  (@locked_keys_for_uniqueness || {}).values.each(&:unlock)
  @locked_keys_for_uniqueness = {}
end