Skip to content

Instantly share code, notes, and snippets.

@mxriverlynn
Created June 13, 2011 20:47
Show Gist options
  • Save mxriverlynn/1023657 to your computer and use it in GitHub Desktop.
Save mxriverlynn/1023657 to your computer and use it in GitHub Desktop.
Code For: Partially Solving The Date Parsing Defficiency Of Rails 3 And Mongoid
class SomeModel
include Mongoid::Document
field :date, :type => Date
validates_presence_of :date
def date=(value)
begin
date_parsed = value.to_date
write_attribute :date, date_parsed
@bad_date = nil
rescue
write_attribute :date, nil
@bad_date = value
end
end
def date
return @bad_date if @bad_date
read_attribute :date
end
end
module Mongoid
module DateField
extend ActiveSupport::Concern
included do
validates_with Mongoid::DateFieldValidator
end
module ClassMethods
def date_field(name)
self.class_eval(<<-EOL, __FILE__, __LINE__)
field :#{name}, :type => Date
def #{name}=(value)
set_date_field_value :#{name}, value
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)
field = get_date_field name
begin
parsed_value = value.to_date
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)
value = raw_value.to_date if raw_value
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]
is_valid = false
model.errors.add name, "must be a valid date: MM/DD/YYYY"
end
end
is_valid
end
end
end
class SomeModel
include Mongoid::Document
include Mongoid::DateField
date_field :date
end
med_data = params[:medication]
start_date = med_data[:start_date]
prescription_date = med_data[:prescription_date]
med_data.reject! {|k,v| [:start_date, :prescription_date].include? k.to_sym}
med = Medication.new med_data
med.start_date = start_date
med.prescription_date = prescription_date
med.save
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment