Module: ValidatesLengthsFromDatabase::ClassMethods

Defined in:
lib/validates_lengths_from_database.rb

Instance Method Summary collapse

Instance Method Details

#validates_lengths_from_database(options = {}) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/validates_lengths_from_database.rb', line 11

def validates_lengths_from_database(options = {})
  options.symbolize_keys!

  return false unless self.table_exists?
  options[:only]    = Array[options[:only]]   if options[:only] && !options[:only].is_a?(Array)
  options[:except]  = Array[options[:except]] if options[:except] && !options[:except].is_a?(Array)
  options[:limit] ||= {}

  if options[:limit] and !options[:limit].is_a?(Hash)
    options[:limit] = {:string => options[:limit], :text => options[:limit]}
  end

  if options[:only]
    columns_to_validate = options[:only].map(&:to_s)
  else
    columns_to_validate = column_names.map(&:to_s)
    columns_to_validate -= options[:except].map(&:to_s) if options[:except]
  end

  columns_to_validate.each do |column|
    column_schema = columns.find {|c| c.name == column }
    next if column_schema.nil?
    next if ![:string, :text].include?(column_schema.type)
    next if column_schema.respond_to?(:array) && column_schema.array

    column_limit = options[:limit][column_schema.type] || column_schema.limit
    next unless column_limit

    class_eval do
      validates_length_of column, :maximum => column_limit, :allow_blank => true
    end
  end

  nil
end