Class: DatabaseValidations::UniquenessOptions

Inherits:
Object
  • Object
show all
Defined in:
lib/database_validations/validations/uniqueness_options.rb

Constant Summary collapse

CUSTOM_OPTIONS =
%i[where index_name].freeze
DEFAULT_OPTIONS =
{ allow_nil: true, case_sensitive: true, allow_blank: false }.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(field, options, adapter) ⇒ UniquenessOptions

Returns a new instance of UniquenessOptions.



8
9
10
11
12
13
14
15
# File 'lib/database_validations/validations/uniqueness_options.rb', line 8

def initialize(field, options, adapter)
  @field = field
  @options = options
  @adapter = adapter

  raise_if_unsupported_options!
  raise_if_index_missed! unless ENV['SKIP_DB_UNIQUENESS_VALIDATOR_INDEX_CHECK']
end

Instance Attribute Details

#fieldObject (readonly)

Returns the value of attribute field.



6
7
8
# File 'lib/database_validations/validations/uniqueness_options.rb', line 6

def field
  @field
end

Instance Method Details

#case_sensitiveBoolean|nil

Returns:

  • (Boolean|nil)


71
72
73
# File 'lib/database_validations/validations/uniqueness_options.rb', line 71

def case_sensitive
  @case_sensitive ||= options[:case_sensitive]
end

#columnsArray<String>

Returns:

  • (Array<String>)


46
47
48
# File 'lib/database_validations/validations/uniqueness_options.rb', line 46

def columns
  @columns ||= Helpers.unify_columns(field, scope)
end

#handle_unique_error(instance) ⇒ Object



17
18
19
20
21
22
# File 'lib/database_validations/validations/uniqueness_options.rb', line 17

def handle_unique_error(instance)
  error_options = options.except(:case_sensitive, :scope, :conditions, :attributes, *CUSTOM_OPTIONS)
  error_options[:value] = instance.public_send(options[:attributes])

  instance.errors.add(options[:attributes], :taken, error_options)
end

#if_and_unless_pass?(instance) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
# File 'lib/database_validations/validations/uniqueness_options.rb', line 35

def if_and_unless_pass?(instance)
  (options[:if].nil? || condition_passes?(options[:if], instance)) &&
    (options[:unless].nil? || !condition_passes?(options[:unless], instance))
end

#index_nameString|Symbol|nil

Returns:

  • (String|Symbol|nil)


66
67
68
# File 'lib/database_validations/validations/uniqueness_options.rb', line 66

def index_name
  @index_name ||= options[:index_name]
end

#keyString

Returns:

  • (String)


41
42
43
# File 'lib/database_validations/validations/uniqueness_options.rb', line 41

def key
  @key ||= index_name ? Helpers.generate_key_for_uniqueness_index(index_name) : Helpers.generate_key_for_uniqueness(columns)
end

#messageString|nil

Returns:

  • (String|nil)


56
57
58
# File 'lib/database_validations/validations/uniqueness_options.rb', line 56

def message
  @message ||= options[:message]
end

#scopeArray<String|Symbol>

Returns:

  • (Array<String|Symbol>)


61
62
63
# File 'lib/database_validations/validations/uniqueness_options.rb', line 61

def scope
  @scope ||= Array.wrap(options[:scope])
end

#validates_uniqueness_optionsHash<Symbol, Object>

Returns:

  • (Hash<Symbol, Object>)


25
26
27
28
29
30
31
32
# File 'lib/database_validations/validations/uniqueness_options.rb', line 25

def validates_uniqueness_options
  where_clause_str = where_clause

  DEFAULT_OPTIONS
    .merge(options)
    .except(*CUSTOM_OPTIONS)
    .tap { |opts| opts[:conditions] = -> { where(where_clause_str) } if where_clause }
end

#where_clauseString|nil

Returns:

  • (String|nil)


51
52
53
# File 'lib/database_validations/validations/uniqueness_options.rb', line 51

def where_clause
  @where_clause ||= options[:where]
end