Rails和Heroku PGError:where参数不存在

时间:2013-02-20 18:49:04

标签: ruby-on-rails sqlite postgresql heroku rails-activerecord

我已经四处搜索并发现了一些类似的搜索,但没有真正详细说明我所遇到的问题,所以我认为我会分享我的发现。

问题
当将Ruby on Rails项目推送到Heroku( DB = PostgresQL )时,我得到了一些我在开发环境中没有收到的错误( DB = SQLite )。

详情
我有一个模型,比如Message,它与owner有多态关联,可以是UserCustomer(这些不是实际的模型,所以不要问为什么存在多态关联,这显然类似于{{1}中的布尔customer列} model。。

使用User查询数据库时,我在ActiveRecord模型中有一个检索与某个Message相关联的消息的方法(请务必注意,在多态关联中一个User,在这种情况下,owner模型会添加两列,Messageowner_id,其中owner_type可能是owner_typeUser

该方法定义如下:

Customer

如您所见,message_ids字符串被定义为可以轻松插入到模型的 def self.getMessagesForUser(user) message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \"User\"" where("message_id IN (#{message_ids})", user_id: user.id) end 方法中(提示:这就是问题所在)。

错误
我收到了,出现以下错误:

where

我知道有些事情是错误的,因为这个论点被认为是一个专栏,所以我做了一些修改并找到了解决方案。

解决方案
我没有意识到在查询中使用单引号或双引号时,某些查询语言(如SQL,PostgresQL等)并不像SQLite那样宽容。具体来说,PostgresQL不支持查询中的双引号,即 ActionView::Template::Error (PGError: ERROR: column "Customer" does not exist) 字符串中User的{​​{1}}参数!我只是改变了方法中的行:

owner_type

为:

message_ids

更简单地说:

message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \"User\""

事情进展顺利。

1 个答案:

答案 0 :(得分:1)

<强>解决方案
我没有意识到在查询中使用单引号或双引号时,某些查询语言(如SQL,PostgresQL等)并不像SQLite那样宽容。具体来说,PostgresQL不支持查询中的双引号,即User字符串中owner_type的{​​{1}}参数!我只是改变了方法中的行:

message_ids

为:

    message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \"User\""

更简单地说:

message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \'User\'"

事情进展顺利。