Module: ValidatesBySchema::ClassMethods

Defined in:
lib/validates_by_schema.rb

Instance Method Summary collapse

Instance Method Details

#all_foreign_keysObject



51
52
53
54
55
# File 'lib/validates_by_schema.rb', line 51

def all_foreign_keys
  reflect_on_all_associations(:belongs_to).collect do |association|
    association.foreign_key.to_s
  end
end

#customize_columns(columns, options) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/validates_by_schema.rb', line 26

def customize_columns(columns, options)
  # Allow user to specify :only or :except options
  { only: :select!, except: :reject! }.each do |k, v|
    if options[k]
      attrs = Array(options[k]).collect(&:to_s)
      columns.send(v) { |c| attrs.include?(c.name) }
    end
  end
end

#define_association_validationsObject



43
44
45
46
47
48
49
# File 'lib/validates_by_schema.rb', line 43

def define_association_validations
  reflect_on_all_associations(:belongs_to).each do |association|
    column = columns_hash[association.foreign_key.to_s]
    next unless column
    validates association.name, presence: true unless column.null
  end
end

#define_validations(columns) ⇒ Object



36
37
38
39
40
41
# File 'lib/validates_by_schema.rb', line 36

def define_validations(columns)
  columns.each do |c|
    vo = ValidationOption.new(c).to_hash
    validates c.name, vo if vo.present?
  end
end

#schema_validateable_columnsObject



16
17
18
19
20
21
22
23
24
# File 'lib/validates_by_schema.rb', line 16

def schema_validateable_columns
  # Don't auto validate primary, foreign keys or timestamps
  foreign_keys = all_foreign_keys
  columns.reject do |c|
    c.name == primary_key.to_s ||
    %w(updated_at created_at).include?(c.name) ||
    foreign_keys.include?(c.name)
  end
end

#validates_by_schema(options = {}) ⇒ Object



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

def validates_by_schema(options = {})
  return unless table_exists?

  columns = schema_validateable_columns
  customize_columns(columns, options)
  define_validations(columns)
  define_association_validations
end