I have a Post model that has a column ‘published_on’. What I would
like to do is be able to set the published_on date in the future so a
post will automatically become visible to the pubic if the
published_on timestamp is before the current timestamp.
I have created a named scope for this so I can do something like:
@posts = Post.published
Here is the named scope in my Post model:
named_scope :published, lambda { { :conditions => [‘published_on < ?’,
Time.now] } }
The problem is timezones. I am in the Central timezone (-6). So in my
environment.rb I have set config.time_zone = ‘Central Time (US &
Canada)’.
When I use script/console:
Time.now
=> Tue Jan 19 16:17:37 -0600 2010
p = Post.find(1)
=> #<Post id: 2, category_id: nil, title: “This Is The Post Of
Tomorrow”, content: “This post will automatically be published on
2010-0…”, published_on: “2010-01-19 18:20:59”, created_at:
“2010-01-18 22:54:24”, updated_at: “2010-01-19 18:21:01”>p.published_on = Time.now
=> Tue Jan 19 16:18:32 -0600 2010p.save
=> truep.published_on
=> Tue, 19 Jan 2010 16:18:32 CST -06:00p
=> #<Post id: 2, category_id: nil, title: “This Is The Post Of
Tomorrow”, content: “This post will automatically be published on
2010-0…”, published_on: “2010-01-19 22:18:32”, created_at:
“2010-01-18 22:54:24”, updated_at: “2010-01-19 22:18:35”>
So p.published on returns a time of 16:18:32 but in the database we
see 22:18:32, a difference of six hours (central time).
The named scope generates SQL like:
SELECT * FROM posts WHERE (published_on < ‘2010-01-19 16:21:18’)
16:18:32 is less than 16:21:18, but the database is 22:18:32.
Is there a setting that I need to modify so that the timestamps are
inserted correctly or selected correctly? What am I doing wrong?
Thanks!
Which is correct.