class ActiveModel::Type::Date

Active Model Date Type

Attribute type for date representation. It is registered under the :date key.

class Person
  include ActiveModel::Attributes

  attribute :birthday, :date
end

person = Person.new
person.birthday = "1989-07-13"

person.birthday.class # => Date
person.birthday.year  # => 1989
person.birthday.month # => 7
person.birthday.day   # => 13

String values are parsed using the ISO 8601 date format. Any other values are cast using their to_date method, if it exists.

Constants

ISO_DATE

Public Instance Methods

type() click to toggle source
# File lib/active_model/type/date.rb, line 30
def type
  :date
end
type_cast_for_schema(value) click to toggle source
# File lib/active_model/type/date.rb, line 34
def type_cast_for_schema(value)
  value.to_fs(:db).inspect
end

Private Instance Methods

cast_value(value) click to toggle source
# File lib/active_model/type/date.rb, line 39
def cast_value(value)
  if value.is_a?(::String)
    return if value.empty?
    fast_string_to_date(value) || fallback_string_to_date(value)
  elsif value.respond_to?(:to_date)
    value.to_date
  else
    value
  end
end
fallback_string_to_date(string) click to toggle source
# File lib/active_model/type/date.rb, line 57
def fallback_string_to_date(string)
  parts = begin
    ::Date._parse(string, false)
  rescue ArgumentError
  end

  new_date(*parts.values_at(:year, :mon, :mday)) if parts
end
fast_string_to_date(string) click to toggle source
# File lib/active_model/type/date.rb, line 51
def fast_string_to_date(string)
  if string =~ ISO_DATE
    new_date $1.to_i, $2.to_i, $3.to_i
  end
end
new_date(year, mon, mday) click to toggle source
# File lib/active_model/type/date.rb, line 66
def new_date(year, mon, mday)
  unless year.nil? || (year == 0 && mon == 0 && mday == 0)
    ::Date.new(year, mon, mday) rescue nil
  end
end
value_from_multiparameter_assignment(*) click to toggle source
Calls superclass method
# File lib/active_model/type/date.rb, line 72
def value_from_multiparameter_assignment(*)
  time = super
  time && new_date(time.year, time.mon, time.mday)
end