【发布时间】:2012-11-20 07:52:37
【问题描述】:
我正在尝试找到一种与数据库无关的方法来将日期与活动记录查询进行比较。我有以下查询:
UserRole.where("(effective_end_date - effective_start_date) > ?", 900.seconds)
这在 MySQL 上运行良好,但在 PG 上会产生错误,因为它生成的 sql 不包含“interval”语法。从控制台:
←[1m←[36mUserRole Load (2.0ms)←[0m ←[1mSELECT "user_roles".* FROM "user_roles" WHERE "user_roles"."effective_end_date" IS NULL AND ((effective_end_d
ate - effective_start_date) > '--- 900
...
')←[0m
ActiveRecord::StatementInvalid: PG::Error: ERROR: invalid input syntax for type interval: "--- 900
当我使用 to_sql I 选项运行它时,我得到:
irb(main):001:0> UserRole.where("effective_end_date - effective_start_date) > ?", 900.seconds).to_sql
=> "SELECT \"user_roles\".* FROM \"user_roles\" WHERE \"user_roles\".\"effective_end_date\" IS NULL AND (effective_end_date - effective_start_date) >
'--- 900\n...\n')"
感谢所有帮助。
【问题讨论】:
-
UserRole.where(...)与您从日志中挖出的 SQL 不匹配;并且在您的日志查询中执行900.to_yaml,这没有任何意义。 -
这是正在生成的内容。我没有在下面粘贴完整的 rails 错误堆栈,但如果有用的话可以。我添加了一个 to_sql 版本,以便您可以生成生成的内容。感谢您的帮助
-
知道
effective_end_date is null的来源吗?900.seconds的 YAML 化对我来说没有任何意义。而且您在.where中缺少(,copy'n'paste 错误?effective_start_date和effective_end_date是日期还是日期时间/时间戳? -
嗯。我使用
.where(..., 900.seconds)的查询也在对 900 进行 YAML 化,Rails 到底在做什么过分聪明的废话?当900.seconds.class表示Fixnum时,seconds实际上返回一个ActiveSupport::Duration。叹息。 -
这是一个很好的问题 - 没有发现 effective_end_date 为空。它来自模型的默认范围。我会重新运行它,看看它是否会改变任何东西
标签: ruby-on-rails postgresql datetime activerecord rails-activerecord