我在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。如何更换?
由于
答案 0 :(得分:2)
您应该使用=
检查与非空值的相等性:
['cars.sold IS ? AND cars.deactivated = ?', nil, false]
当您面临NULL和简单{{1}时,您通常会在is
,is null
,is not null
和is distinct from
中使用is not distinct from
比较不会按照你想要的方式工作。如果您使用=
或is
值但不使用ActiveRecord用于表示PostgreSQL布尔值的true
和false
字符串,则可以使用't'
作为布尔值
有关详细信息,请参阅手册中的Comparison Operators。
或者,您可以让ActiveRecord构建整个内容,而不是使用旧式'f'
内容:
:conditions
这样,ActiveRecord负责所有本地到PostgreSQL类型的转换,它将为您选择正确的比较运算符。
此外,在一个数据库(SQLite)上进行开发并在另一个数据库(PostgreSQL)上进行部署是一个非常糟糕的想法,只会导致痛苦,痛苦和脱发。数据库之间存在各种差异,没有ORM可以隔离您。请修复此错误,然后立即将开发环境切换到PostgreSQL。