Сравнение datetime не работает - PullRequest
0 голосов
/ 24 апреля 2010

Я создаю приложение Rails, которое использует MySQL. У меня есть таблица в моей БД, как это:

  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 ]

1 голос
/ 24 апреля 2010

Я бы создал именованную область в вашей модели вставки:

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

Обратите внимание, что лямбда-выражение требуется для задержки оценки Time.zone.now до того момента, когда (именованная) область действия будет фактически вызвана. В противном случае будет использовано время оценки класса.

Теперь вы можете получить все просроченные пасты с помощью простого:

@pastes = Paste.expired

- Довольно чисто, да?

0 голосов
/ 24 апреля 2010

Я уже решил это. Это было связано с часовыми поясами. Это работает:

@pastes = Paste.find(:all, :conditions => "expire > '#{Time.now.utc.to_s(:db)}'")
#                                                               ^^^ this does it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...