我四处搜索,发现了一些类似的搜索,但没有一个真正详细说明我遇到的问题,所以我想我会分享我的发现。
问题
将 Ruby on Rails 项目推送到 Heroku ( DB = PostgresQL ) 时,我遇到了一些在开发环境 ( DB = SQLite ) 中没有收到的错误。
详细信息
我有一个模型,例如Message
,与模型中的布尔列)。owner
User
Customer
customer
User
使用查询数据库时,ActiveRecord
我在模型中有一个方法,该方法Message
检索与某个关联的消息User
(重要的是要注意,在 a 的多态关联中owner
,在这种情况下,模型将Message
添加两列,owner_id
并且是或)owner_type
owner_type
User
Customer
该方法定义如下:
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
如您所见,message_ids 字符串被定义为可以轻松插入到where
模型的方法中(提示:这就是问题所在)。
我收到的错误
,以下错误:
ActionView::Template::Error (PGError: ERROR: column "Customer" does not exist)
我知道有些地方出了问题,因为这个论点被认为是一个专栏,所以我做了一些修改并找到了解决方案。
解决方案
我没有意识到在查询中使用单引号或双引号时,某些查询语言(如 SQL、PostgresQL 等)不像 SQLite 那样宽容。具体来说,PostgresQL 不支持查询中的双引号,即字符串中的User
参数!我只是将方法中的行从:owner_type
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\'"
更简单地说:
"User" needed to be 'User'
事情进展顺利。