【问题标题】:Rails Time is not changing over the course of a Console SessionRails 时间在控制台会话过程中不会改变
【发布时间】:2013-02-25 16:44:56
【问题描述】:

我正在开发一个 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,结果都一样。

【问题讨论】:

  • 您能确认代码中没有冻结时间吗?比如使用Timecop?
  • 我不知道。我检查了 Gemfile 和 Timecop,或者其中包含时间一词的任何内容,这不是依赖项。在这个项目中不需要这种类型的功能。
  • 这段代码是否在范围内?
  • 是的,这会导致问题吗?
  • 你必须将它包装在一个 lambda 中。我会在答案中告诉你

标签: ruby-on-rails ruby ruby-on-rails-3.2


【解决方案1】:

像这样重写你的范围:

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

Time.zone.now 出现“冻结”,因为作用域宏只执行一次(在加载类时)。使用 lambda 可以防止这种情况发生。

【讨论】:

  • 工作就像一个魅力!谢谢。
  • 在 ruby​​ 1.9+ 中,相当于lambda { # code }。 lambda 是一种特殊的过程,对参数要求更严格。 proc 是一段可以传递的代码,就像一个块。见ruby-doc.org/core-1.9.3/Proc.html
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2018-02-04
相关资源
最近更新 更多