module FieldHelpers::ClassMethods

Public Instance Methods

field(name, klasses = nil, options = {}) click to toggle source

field lets you declare your fields instead of using the underscore syntax. An optional class restriction can be passed in.

# File lib/volt/models/field_helpers.rb, line 40
def field(name, klasses = nil, options = {})
  if klasses
    klasses = [klasses].flatten

    unless klasses.any? {|kl| FIELD_CASTS.key?(kl) }
      klass_names = FIELD_CASTS.keys.map(&:to_s).join(', ')
      msg = "valid field types is currently limited to #{klass_names}, you passed: #{klasses.inspect}"
      fail FieldHelpers::InvalidFieldClass, msg
    end

    # Add NilClass as an allowed type unless allow_nil: false was passed.
    unless options[:allow_nil] == false
      klasses << NilClass
    end
  end

  self.fields_data ||= {}
  self.fields_data[name] = [klasses, options]

  if klasses
    # Add type validation, execpt for String, since anything can be cast to
    # a string.
    unless klasses.include?(String)
      validate name, type: klasses
    end
  end

  define_method(name) do
    get(name)
  end

  define_method(:"#{name}=") do |val|
    # Check if the value assigned matches the class restriction
    if klasses
      # Cast to the right type
      klasses.each do |kl|
        if (func = FIELD_CASTS[kl])
          # Cast on the first available caster
          val = func[val]
          break
        end
      end
    end

    set(name, val)
  end
end