views:

79

answers:

2

Hi

I have a date_select in my view inside a form, however on submit the value returned is in a hash form like so:

{"(1i)"=>"2010", "(2i)"=>"8", "(3i)"=>"16"}

how can i convert that in to a Date format in rails so i can use it as a condition when querying the database e.g :condition => {:dates == :some_date_from_date_select}? i tried calling Date.parse(:some_date_from_date_select) but it didn't work because its expecting a string and not a hash map.

is there a rails way to do this?

thanks

+1  A: 

I don't know about a rails way, but this "one-liner" does the trick:

irb(main):036:0> d = Date.parse( {"(1i)"=>"2010", "(2i)"=>"8", "(3i)"=>"16"}.to_a.sort.collect{|c| c[1]}.join("-") )
=> #<Date: 4910849/2,0,2299161>
irb(main):037:0> d.to_s
=> "2010-08-16"

Or, with less magic:

h={"(1i)"=>"2010", "(2i)"=>"8", "(3i)"=>"16"}
d=Date.new(h['(1i)'].to_i, h['(2i)'].to_i, h['(3i)'].to_i)
d.to_s
=> "2010-08-16"
ngoozeff
hero, thank you
Mo
A: 

This particular code (the one that does conversion) can be tracked from lib/active_record/connection_adapters/abstract/schema_definitions.rb, line no 67 onwards, i.e. the method type_cast.

These two methods are used to generate a date from string:

def fast_string_to_date(string)
  if string =~ Format::ISO_DATE
    new_date $1.to_i, $2.to_i, $3.to_i
  end
end

# Doesn't handle time zones.
def fast_string_to_time(string)
  if string =~ Format::ISO_DATETIME
    microsec = ($7.to_f * 1_000_000).to_i
    new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
  end
end

# Note that ISO_DATE is:
ISO_DATE = /\A(\d{4})-(\d\d)-(\d\d)\z/
Swanand