【问题标题】:Rails console query returns different results compared to pure sql query与纯 sql 查询相比,Rails 控制台查询返回不同的结果
【发布时间】: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 生成了正确的查询,所以我很困惑为什么它不应该返回相同的对象。 dateDateTime 字段吗?你有after_findafter_initialize 方法吗?
  • 是的,日期是一个日期时间。我将不得不在 geokit gems 周围挖掘,看看是否有 after_find/after_initialize 方法调用

标签: sql ruby-on-rails activerecord


【解决方案1】:
. . . .where("date > current_timestamp - interval '5 hours'")

这个 WHERE 子句的标准 SQL 语法应该是

WHERE "date" > current_timestamp - interval '5' hour

在标准 SQL 中,date 是保留字;用作列名的保留字需要用双引号引起来。请注意,数字在单引号内,并且关键字 intervalhour 没有被引用。对标准 SQL 的支持千差万别,尤其是在您附近。 (引用保留字和日期算术。)

所以。 . .检查您的目标平台的文档,以确保您正确引用(或不引用)这两件事。

不过,我很难说服自己这可能是造成问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2018-10-29
    • 2011-06-24
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多