我在 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 null
、is not null
、is distinct from
和 is not distinct from
中使用is
,简单的=
比较不会按照你想要的方式工作。如果您使用的是true
或false
值,则可以将is
用于布尔值,而不是 ActiveRecord 用于表示 PostgreSQL 布尔值的't'
和'f'
字符串。
有关详细信息,请参阅手册中的比较运算符。
或者,你可以让ActiveRecord构建整个东西,而不是使用老式的:conditions
的东西:
scope :by_default_checks, where(:sold => nil).where(:deactivated => false)
这样,ActiveRecord负责所有本机到PostgreSQL类型的转换,它将为您选择正确的比较运算符。
此外,在一个数据库(
SQLite)上开发并在另一个数据库(PostgreSQL)上部署是一个非常糟糕的主意,只会导致疼痛,痛苦和脱发。数据库之间存在各种差异,没有ORM可以使您免受差异。请修复此错误,然后立即将您的开发环境切换到PostgreSQL。