我正在创建一个使用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
,即使是未过期的也不会:(
答案 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