【发布时间】:2011-04-10 19:05:27
【问题描述】:
所以在我的 Rails 控制台中,我有一个生成 SQL 的活动记录查询。我查看我的logs/development,可以看到正在生成的 SQL。
由于某种原因,我在运行活动记录查询时没有得到预期的结果。我查看了我的日志并将 sql 复制/粘贴到连接到我的数据库的控制台中,然后突然返回正确的结果。任何想法为什么会发生这种情况?我正在使用 PostgreSQL。
我正在尝试查找过去 5 小时内开张的商店。
EDIT 减去 10 小时使这个查询工作....
ActiveRecord 调用(内部来自 geokit gem):
Store.within(10, :origin =>[30.267153000000000, -97.743060799999970]).where("date > current_timestamp - interval '5 hours'")
生成的 SQL:
SELECT "store".*,
(ACOS(least(1,COS(0.5282614750548792)*COS(-1.705938231937002)*COS(RADIANS(store.lat))*COS(RADIANS(store.lng))+
COS(0.5282614750548792)*SIN(-1.705938231937002)*COS(RADIANS(store.lat))*SIN(RADIANS(store.lng))+
SIN(0.5282614750548792)*SIN(RADIANS(store.lat))))*3963.19)
AS distance FROM "store" WHERE ((store.lat>30.122583147146404 AND store.lat<30.41172285285359 AND store.lng>-97.91044799232348 AND store.lng<-97.57567360767642)) AND ((
(ACOS(least(1,COS(0.5282614750548792)*COS(-1.705938231937002)*COS(RADIANS(store.lat))*COS(RADIANS(store.lng))+
COS(0.5282614750548792)*SIN(-1.705938231937002)*COS(RADIANS(store.lat))*SIN(RADIANS(store.lng))+
SIN(0.5282614750548792)*SIN(RADIANS(store.lat))))*3963.19)
<= 10)) AND (date > current_timestamp - interval '5 hours')
【问题讨论】:
-
是否有可能商店在您第一次运行查询时没有打开,但是当您在控制台运行查询时它们已打开?换句话说,这是可重复的吗?您仍然从同一个查询中得到不同的结果吗?
-
不,那是不可能的。它们是不变的日期。我可以重复查询并获得相同的结果。没有任何变化。
-
我不得不说,如果我减去足够多的时间,我就会得到预期的结果。说我减去“日期> current_timestamp - 间隔'10小时'”......然后它就可以了
-
在我看来 ActiveRecord 生成了正确的查询,所以我很困惑为什么它不应该返回相同的对象。
date是DateTime字段吗?你有after_find或after_initialize方法吗? -
是的,日期是一个日期时间。我将不得不在 geokit gems 周围挖掘,看看是否有 after_find/after_initialize 方法调用
标签: sql ruby-on-rails activerecord