0

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

谢谢

4

1 回答 1

2

您应该使用=来检查非空值是否相等:

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

你通常使用isin is null, is not null, is distinct from, andis not distinct from当你遇到 NULL 并且简单的=比较不会按照你想要的方式工作。is如果您使用trueorfalse值而不是ActiveRecord 用来表示 PostgreSQL 布尔值的字符串,'t'则可以使用布尔值。'f'

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

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

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

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


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

于 2013-09-12T19:17:16.677 回答