2

Rails 3.2 アプリケーションに取り組んでいます。Ruby 1.9.3 と Postgres 9.1.3 で実行しています。サイトのほとんどのコンテンツは、published_at 日時スタンプによって編成されています。公開クエリは、Time.zone.now に関連するコンテンツを要求します。

Post.where(["published_at <= ?", Time.zone.now])

コンソールをロードしてこの投稿を要求すると、次のクエリが生成されました。

SELECT "posts".* FROM "posts" WHERE (published_at <= '2013-02-25 16:32:19.852109')

そして 10 分後、同じコンソール セッションで:

SELECT "posts".* FROM "posts" WHERE (published_at <= '2013-02-25 16:32:19.852109')

Rails がクエリに挿入する時間は変化していないことに注意してください。ローカル開発セッションを数時間実行すると、Rails が注入するタイムスタンプは常に同じです。

また、Time.zone.now を Time.now および Time.new に交換しようとしましたが、結果はすべて同じでした。

4

1 に答える 1

4

スコープを次のように書き換えます。

scope :myscope, ->{ where(["published_at <= ?", Time.zone.now]) }

Time.zone.nowスコープ マクロは1 回だけ実行されるため(クラスがロードされたとき)、「フリーズ」しているように見えます。ラムダを使用すると、これを防ぐことができます。

于 2013-02-25T16:55:02.710 に答える