PostgreSQL - 不正确的语法,当条件是"false"值时



我在 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。如何更换?

谢谢

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

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

当你面对 NULL 时,你通常在 is nullis not nullis distinct fromis not distinct from 中使用is,简单的=比较不会按照你想要的方式工作。如果您使用的是truefalse值,则可以将is用于布尔值,而不是 ActiveRecord 用于表示 PostgreSQL 布尔值的't''f'字符串。

有关详细信息,请参阅手册中的比较运算符。

或者,你可以让ActiveRecord构建整个东西,而不是使用老式的:conditions的东西:

scope :by_default_checks, where(:sold => nil).where(:deactivated => false)

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


此外,在一个数据库(

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

最新更新