我已经四处搜索并发现了一些类似的搜索,但没有真正详细说明我所遇到的问题,所以我认为我会分享我的发现。
问题
当将Ruby on Rails项目推送到Heroku( DB = PostgresQL )时,我得到了一些我在开发环境中没有收到的错误( DB = SQLite )。
详情
我有一个模型,比如Message
,它与owner
有多态关联,可以是User
或Customer
(这些不是实际的模型,所以请不要问为什么存在多态关联,这显然类似于{{1}中的布尔customer
列} model。。
使用User
查询数据库时,我在ActiveRecord
模型中有一个检索与某个Message
相关联的消息的方法(请务必注意,在多态关联中一个User
,在这种情况下,owner
模型会添加两列,Message
和owner_id
,其中owner_type
可能是owner_type
或User
)
该方法定义如下:
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\""
事情进展顺利。
答案 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\'"
事情进展顺利。