PostgreSQL - 语法不正确,条件为“false”时

时间:2013-09-12 19:06:31

标签: sql ruby-on-rails ruby postgresql heroku

我在Rails中有这个范围:

  scope :by_default_checks, {:conditions => ['cars.sold IS ? AND cars.deactivated IS ?', nil, false]}

@cars = Car.by_title(params[:search][:title_like]).by_greater(params[:search][:amount_gte]).by_smaller(params[:search][:amount_lte]).by_default_checks

并且在Heroku上我收到了这个错误:

Completed 500 Internal Server Error in 6ms
... AND cars.sold IS NULL AND cars.deactivated IS 'f')
SELECT "cars".* FROM "cars"  WHERE (cars.title LIKE '%iphoe%') AND (cars.sold IS NULL AND cars.deactivated IS 'f')
PG::SyntaxError: ERROR:  syntax error at or near "'f'"

此代码适用于SQLite,但不适用于PostgreSQL。如何更换?

由于

1 个答案:

答案 0 :(得分:2)

您应该使用=检查与非空值的相等性:

['cars.sold IS ? AND cars.deactivated = ?', nil, false]

当您面临NULL和简单{{1}时,您通常会在isis nullis not nullis distinct from中使用is not distinct from比较不会按照你想要的方式工作。如果您使用=is值但不使用ActiveRecord用于表示PostgreSQL布尔值的truefalse字符串,则可以使用't'作为布尔值

有关详细信息,请参阅手册中的Comparison Operators

或者,您可以让ActiveRecord构建整个内容,而不是使用旧式'f'内容:

:conditions

这样,ActiveRecord负责所有本地到PostgreSQL类型的转换,它将为您选择正确的比较运算符。


此外,在一个数据库(SQLite)上进行开发并在另一个数据库(PostgreSQL)上进行部署是一个非常糟糕的想法,只会导致痛苦,痛苦和脱发。数据库之间存在各种差异,没有ORM可以隔离您。请修复此错误,然后立即将开发环境切换到PostgreSQL。