【问题标题】:Rails date equality not working in where clauseRails 日期平等在 where 子句中不起作用
【发布时间】:2011-08-31 22:54:44
【问题描述】:

假设我有ModelAModelB。当我将ModelA 的实例保存到数据库时,它还会创建/保存ModelB 的实例。在数据库中,我最终得到created_at 的UTC,它们的显示完全相同。例如:

puts ModelA.first.created_at  # Wed, 31 Aug 2011 22:49:28 UTC +00:00
puts ModelB.first.created_at  # Wed, 31 Aug 2011 22:49:28 UTC +00:00

所以我希望像下面这样的查询返回匹配的记录(但它没有)

# model_instance is instance of SomeModel
ModelA.where(created_at:model_b_instance.created_at)  # returns []

但是像这样,使用 to_s(:db) 确实有效

ModelA.each do |m|
  if m.created_at.to_s(:db) == model_b_instance.created_at.to_s(:db)
    ...  # found matches here
  end
end

有人可以解释我在这里做错了什么吗?我希望能够编写像ModelA.where(created_at: ... ) 这样的查询,但我目前不得不迭代和匹配to_s(:db)

【问题讨论】:

  • 要尝试两件事:1)查看数据库中的 created_at 值是什么——也许有一些像时区这样的东西(也许 rails 正在推断一个时区而不是另一个)2 ) 在 Rails 日志中查看由您的 ModelA.where 调用生成的实际 sql 查询——也许它正在做某种意想不到的事情。
  • @John 你的#1 基本上是对的。尽管puts ...created_at 显示为同一事物,但数据库中的实际值与毫秒之间的不同。如果您想发表您的评论作为答案,我会将其标记为已接受。
  • 未得到:ModelA.where(created_at:model_b_instance.created_at) # 返回 [] 是 ModelA.created_at == ModelB.created_at 也可能带有 :joins

标签: ruby-on-rails ruby database activerecord


【解决方案1】:

尝试两件事:

  1. 查看 db 中 created_at 的值是什么——也许有一些像时区这样的东西(也许 rails 正在推断一个时区而不是另一个时区)
  2. 在 Rails 日志中查看由您的 ModelA.where 调用生成的实际 sql 查询——也许它正在做某种意想不到的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2021-01-09
    • 2015-01-27
    • 2014-01-26
    相关资源
    最近更新 更多