Ruby on rails 使用SQLite在本地运行,但在Heroku:PGError:ERROR:syntax ERROR处或附近运行;空";

Ruby on rails 使用SQLite在本地运行,但在Heroku:PGError:ERROR:syntax ERROR处或附近运行;空";,ruby-on-rails,postgresql,heroku,Ruby On Rails,Postgresql,Heroku,我的代码在本地对sqllite运行良好,但当我推到heroku时,我得到: ActiveRecord::StatementInvalid (PGError: ERROR: syntax error at or near "NULL" LINE 1: ...LECT "beeps".* FROM "beeps" WHERE ((widget_id NOT NULL) AND ...

我的代码在本地对sqllite运行良好,但当我推到heroku时,我得到:

ActiveRecord::StatementInvalid (PGError: ERROR:  syntax error at or near "NULL"
LINE 1: ...LECT  "beeps".* FROM "beeps" WHERE ((widget_id NOT NULL) AND ...
                                                             ^
: SELECT  "beeps".* FROM "beeps" WHERE ((widget_id NOT NULL) AND (updated_at > '2011-02-06 02:27:59.867809') AND (userphone = '0000000xxxx') AND (beeper
= '0000000zzzz') AND (inbound = 't')) ORDER BY beeps.id DESC LIMIT 1):
ruby代码是:

Beep.last(:conditions => [ "(widget_id NOT NULL) AND (updated_at > ?) AND (userphone = ?) AND (beeper = ?) AND (inbound = ?)", 5.minutes.ago, aphone, beeper, inboundflag ])

顺便问一下,是否有任何方法可以使用纯活动记录构造此查询,以便(希望)避免数据库特定的查询字符串?

您确定在Heroku上使用SQLLite而不是MySQL吗?无论哪种方式,查询语法似乎都有点不正确。我会将您的查询修改为:

Beep.last(:conditions => [ "(widget_id IS NOT NULL) AND (updated_at > ?) AND (userphone = ?) AND (beeper = ?) AND (inbound = ?)", 5.minutes.ago, aphone, beeper, inboundflag ]) Beep.last(:conditions=>[(widget_id不为NULL)和(updated_at>?)和(userphone=?)和(beeper=?)和(inbound=?)”,5.minutes.ago,aphone,beeper,inboundflag]) 如果您使用的是Rails3,您可以将条件链接在一起,如下所示:

Beep.where('widget_id IS NOT NULL) .where('updated_at > ?', 5.minutes.ago) .where(userphone: aphone) .where(beeper: beeper) .where(inbound: inboundflag) .last 其中('widget_id不为空) .where('updated_at>?',5.分钟前) .where(用户电话:aphone) .其中(传呼机:传呼机) .where(入站:inboundflag) .最后 非常感谢。“xxx NOT NULL”在sqllite上运行良好,但我认为它应该有“IS”:“xxx NOT NULL”