Skip to content

Instantly share code, notes, and snippets.

@igorescobar
Created October 24, 2012 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igorescobar/3948010 to your computer and use it in GitHub Desktop.
Save igorescobar/3948010 to your computer and use it in GitHub Desktop.
mongoid invalid date workaround
# class SomeModel
# include Mongoid::Document
# include Mongoid::DateField
#
# date_field :date_field1, Date
# date_field :date_field2, DateTime
# date_field :date_field3, Time
# end
module Mongoid
module DateField
extend ActiveSupport::Concern
included do
validates_with Mongoid::DateFieldValidator
end
module ClassMethods
def date_field(name, options = {})
self.class_eval(<<-EOL, __FILE__, __LINE__)
field :#{name}, :type => #{options[:type]}
def #{name}=(value)
set_date_field_value :#{name}, value, #{options}
end
def #{name}
get_date_field_value :#{name}
end
EOL
end
end
def date_fields
@date_fields ||= {}
end
def set_date_field_value(name, value, options)
field = get_date_field name
begin
parsed_value = value.to_date unless options[:allow_nil]
field[:broken_value] = nil
field[:valid] = true
rescue
parsed_value = nil
field[:broken_value] = value
field[:valid] = false
end
write_attribute name, parsed_value
end
def get_date_field_value(name)
field = get_date_field name
if !field.key?(:valid) or field[:valid]
raw_value = read_attribute(name)
begin
value = raw_value.to_date if raw_value
rescue
value = nil
end
else
value = field[:broken_value]
end
value
end
def get_date_field(name)
if date_fields.key? name
field = date_fields[name]
else
field = {}
date_fields[name] = field
end
field
end
end
class DateFieldValidator < ActiveModel::Validator
def validate(model)
is_valid = true
model.date_fields.each do |name, data|
if data[:valid] == false
is_valid = false
model.errors.add name, :invalid_date
end
end
is_valid
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment