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出现“冻结”,因为范围宏只执行一次(加载类时)。使用 lambda 可以防止这种情况。

于 2013-02-25T16:55:02.710 回答