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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(field, options, adapter) ⇒ UniquenessOptions

Returns a new instance of UniquenessOptions.



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

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.



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

def field
  @field
end

Instance Method Details

#columnsArray<String>

Returns:

  • (Array<String>)


44
45
46
# File 'lib/database_validations/validations/uniqueness_options.rb', line 44

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

#handle_unique_error(instance) ⇒ Object



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

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)


33
34
35
36
# File 'lib/database_validations/validations/uniqueness_options.rb', line 33

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)


64
65
66
# File 'lib/database_validations/validations/uniqueness_options.rb', line 64

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

#keyString

Returns:

  • (String)


39
40
41
# File 'lib/database_validations/validations/uniqueness_options.rb', line 39

def key
  @key ||= index_name ? index_name.to_s : Helpers.generate_key(columns)
end

#messageString|nil

Returns:

  • (String|nil)


54
55
56
# File 'lib/database_validations/validations/uniqueness_options.rb', line 54

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

#scopeArray<String|Symbol>

Returns:

  • (Array<String|Symbol>)


59
60
61
# File 'lib/database_validations/validations/uniqueness_options.rb', line 59

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

#validates_uniqueness_optionsHash<Symbol, Object>

Returns:

  • (Hash<Symbol, Object>)


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

def validates_uniqueness_options
  where_clause_str = where_clause

  options.except(*CUSTOM_OPTIONS)
    .merge(allow_nil: true, case_sensitive: true, allow_blank: false)
    .tap { |opts| opts[:conditions] = -> { where(where_clause_str) } if where_clause }
end

#where_clauseString|nil

Returns:

  • (String|nil)


49
50
51
# File 'lib/database_validations/validations/uniqueness_options.rb', line 49

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