Created
October 24, 2012 18:46
-
-
Save igorescobar/3948010 to your computer and use it in GitHub Desktop.
mongoid invalid date workaround
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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