ActiveRecord :: StatementInvalid:PGError:ERROR:运算符不存在:没有时区的时间戳> =整数

时间:2013-12-16 19:55:12

标签: ruby-on-rails postgresql activerecord ruby-on-rails-2

我无法比较rails 2项目中的日期。在我的一个查询中,其中一个条件是:

:conditions => ["bills.created_at >= #{beginning.to_s.delete("-")} AND bills.created_at <= #{ending.to_s.delete("-")}"]

我分别为"2013-10-16""2013-12-15"传递了beginningending。这在我的暂存环境中起作用,但在我的生产环境中被破坏了:

    ActiveRecord::StatementInvalid: PGError: ERROR:  operator does not exist: timestamp without time zone >= integer
    LINE 1: SELECT * FROM "bills" WHERE (created_at >= 20131016)

我该如何解决这个问题?我看到了heroku Postgres error - operator does not exist timestamp without timezone = integer,但没有帮助。

1 个答案:

答案 0 :(得分:1)

您的查询肯定离ActiveRecord查询语法很远。假设您至少使用Rails 3,beginningending是时间对象:

Bill.where("created_at >= ? AND created_at <= ?", beginning, ending)

或者您也可以使用BETWEEN传递Ruby Range

Bill.where(created_at: beginning..ending)

请避免像您刚才那样在查询中插值。生成的查询不受SQL注入保护。

您可能还想查看ActiveRecord文档,以便了解如何正确使用它。

对于Rails&lt; 3你应该将条件传递给find方法。

Bill.find(:all, :conditions => "created_at >= ? AND created_at <= ?", beginning, ending)