2011-08-31 61 views
0

假设我有ModelAModelB。当我将ModelA的实例保存到数据库时,它还会创建/保存ModelB的实例。在分贝我最终与UTC的created_at显示完全相同。例如:Rails日期相等不适用于where子句

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)

+0

两件事情要尝试:1)看看什么created_at值是在分贝 - 也许有什么东西像时区(可能是推断一个时区的一个,但不是其他)2)看看rails会记录你的'ModelA.where'调用正在生成的实际sql查询 - 可能它正在做某种意想不到的事情。 –

+0

@John你的#1大部分是正确的。虽然'puts ... created_at'显示为同样的东西,但数据库中的实际值与毫秒类似。如果您想将您的评论发布为答案,我会将其标记为已接受。 – Dty

+0

没有得到:ModelA.where(created_at:model_b_instance.created_at)#returns []是ModelA.created_at == ModelB.created_at也许与:连接 –

回答

0

两件事情尝试:

  1. 看到什么created_at值在DB - 也许有什么东西掉一样的时区(也许Rails是推断为一个时区,而不是其他)
  2. 在rails日志中查看您的ModelA.where调用正在生成的实际sql查询 - 也许它正在做某种意想不到的事情。