Module: DatabaseValidations::Helpers

Defined in:
lib/database_validations/lib/helpers.rb

Class Method Summary collapse

Class Method Details

.cache_valid_method!(klass) ⇒ Object



5
6
7
8
9
# File 'lib/database_validations/lib/helpers.rb', line 5

def cache_valid_method!(klass)
  return if klass.method_defined?(:valid_without_database_validations?)

  klass.__send__(:alias_method, :valid_without_database_validations?, :valid?)
end

.each_options_storage(klass) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/database_validations/lib/helpers.rb', line 47

def each_options_storage(klass)
  while klass.respond_to?(:validates_db_uniqueness_of)
    storage = storage_of(klass)
    yield(storage) if storage
    klass = klass.superclass
  end
end

.generate_key(type, *args) ⇒ Object



75
76
77
# File 'lib/database_validations/lib/helpers.rb', line 75

def generate_key(type, *args)
  [type, *unify_columns(args)].join('__')
end

.generate_key_for_belongs_to(column) ⇒ Object



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

def generate_key_for_belongs_to(column)
  generate_key(:belongs_to, column)
end

.generate_key_for_uniqueness(*columns) ⇒ Object



67
68
69
# File 'lib/database_validations/lib/helpers.rb', line 67

def generate_key_for_uniqueness(*columns)
  generate_key(:uniqueness, columns)
end

.generate_key_for_uniqueness_index(index_name) ⇒ Object



63
64
65
# File 'lib/database_validations/lib/helpers.rb', line 63

def generate_key_for_uniqueness_index(index_name)
  generate_key(:uniqueness_index, index_name)
end

.handle_error!(instance, error) ⇒ Object



11
12
13
14
15
16
17
18
19
# File 'lib/database_validations/lib/helpers.rb', line 11

def handle_error!(instance, error)
  case error
  when ActiveRecord::RecordNotUnique
    handle_unique_error!(instance, error)
  when ActiveRecord::InvalidForeignKey
    handle_foreign_key_error!(instance, error)
  else false
  end
end

.handle_foreign_key_error!(instance, error) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/database_validations/lib/helpers.rb', line 36

def handle_foreign_key_error!(instance, error)
  adapter = Adapters.factory(instance.class)
  column_key = generate_key_for_belongs_to(adapter.foreign_key_error_column(error.message))

  each_options_storage(instance.class) do |storage|
    return storage[column_key].handle_foreign_key_error(instance) if storage[column_key]
  end

  false
end

.handle_unique_error!(instance, error) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/database_validations/lib/helpers.rb', line 21

def handle_unique_error!(instance, error)
  adapter = Adapters.factory(instance.class)

  keys = [
    generate_key_for_uniqueness_index(adapter.unique_index_name(error.message)),
    generate_key_for_uniqueness(adapter.unique_error_columns(error.message))
  ]

  each_options_storage(instance.class) do |storage|
    keys.each { |key| return storage[key].handle_unique_error(instance) if storage[key] }
  end

  false
end

.storage_of(klass) ⇒ Object



55
56
57
# File 'lib/database_validations/lib/helpers.rb', line 55

def storage_of(klass)
  klass.instance_variable_get(:'@database_validations_storage')
end

.unify_columns(*args) ⇒ Object



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

def unify_columns(*args)
  args.flatten.compact.map(&:to_s).sort
end