比较日期时间不起作用

时间:2010-04-24 17:50:55

标签: mysql ruby-on-rails datetime

我正在创建一个使用MySQL的Rails应用程序。我的数据库中有一张表,如下所示:

  create_table "pastes", :force => true do |t|
    t.string   "title"
    t.text     "body"
    t.string   "syntax"
    t.boolean  "private"
    t.datetime "expire"
    t.string   "password"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

我想向人们展示未过期的pastes,所以我这样做:

@pastes = Paste.find(:all, :conditions => "expire < '#{Time.now.to_s(:db)}'")

但是,即使返回所有pastes。不仅仅是尚未过期的那些。谁能帮我?感谢

哦,将<更改为>不会返回pastes,即使是未过期的也不会:(

2 个答案:

答案 0 :(得分:1)

我会在你的Paste模型中创建一个命名范围:

class Paste < ActiveRecord::Base
  named_scope :expired, lambda {
    { :conditions => ["expire < ?", Time.zone.now] }
  }
end

Rails 3版本:

class Paste < ActiveRecord::Base
  scope :expired, lambda {
    where("expire < ?", Time.zone.now)
  }
end

请注意,lambda需要延迟Time.zone.now的求值,直到实际调用(命名)作用域为止。否则,将使用评估类的时间。

现在您可以通过简单的方式获取所有过期的粘贴:

@pastes = Paste.expired

-Pretty clean,是吗?

答案 1 :(得分:0)

我已经解决了。它与时区有关。这有效:

@pastes = Paste.find(:all, :conditions => "expire > '#{Time.now.utc.to_s(:db)}'")
#                                                               ^^^ this does it