ActiveRecord (2.1.1) and time columns

Hi all,

I'm building an application that will allow store owners to keep track
of the opening and closing times of their shops. For example, a store
owner might input that their shop is open Monday, Wednesday, and
Friday from 9am to 5pm.

To keep track of these store hours, I'm using Store and Opening
models, where each store has many openings.

The openings table looks like:
id
day (string -- day of the week, in words)
opens_at (time)
closes_at (time)

It seems that ActiveRecord (2.1.1) insists on appending a bogus date
to the time for inserts & queries. For example, for a named scope to
allow quick searches for whether a store is opened for a given day &
time, I have to use this:

  named_scope :open_for, lambda { |day, time| { :conditions =>["day
= ? AND opens_at <= ? AND closes_at >= ?", day, "2001-00-01 " <<
time.to_s(:time) << ":00", "2000-01-01 " << time.to_s(:time) << ":
00" ] } }

when I would much prefer something like:

  named_scope :open_for, lambda { |day, time| { :conditions =>["day
= ? AND opens_at <= ? AND closes_at >= ?", day, time, time] } }

Does anyone know of a way to handle time columns more elegantly?

best,

Jacob Patton

ActiveRecord doesn't have the concept of a time independent from a
date, which is what it seems like you need. As far as I know, the Ruby
standard library doesn't either. I would use another data type. It
looks like in your example the minute is always 0, so you could store
only the hour in the database. If you need minute granularity, you
could use a decimal data type and use 9.25 for 9:15am, 13.5 for 1:30
pm, etc.

-Dan Manges
http://www.dcmanges.com/blog

I don't know about Ruby not having a Time object independent from
DateTime, as migrations allow for both types of fields in a database
and they behave differently.

I had a problem similar to yours where Rails insisted in updating Time
fields with 1st Januray 2000 and it turned out that I was trying to
input a Date Time value in a Time field (or something similar).

Try changing the type of the database field and see what happens.

I don't know about Ruby not having a Time object independent from
DateTime, as migrations allow for both types of fields in a database
and they behave differently.

Ruby doesn't have a pure time of day class. If you're database have
time columns then what you get back is a Time object for 1st January
2000 and the appropriate time.

Fred

Yes, that's what it looks like from my end. I ultimately decided to
leave in the date + time concatenation in my named scopes to handle
databases with & without time columns.

(Sorry for the late post -- I didn't have a chance to post back before
going on vacation.)

Jacob