【发布时间】:2013-02-20 18:49:04
【问题描述】:
我四处搜索,发现了一些类似的搜索,但没有一个真正详细说明我遇到的问题,所以我想我会分享我的发现。
问题
在将 Ruby on Rails 项目推送到 Heroku(DB = PostgresQL)时,我遇到了一些在开发环境中没有收到的错误(DB = SQLite)。 p>
详情
我有一个模型,比如Message,它与owner 具有多态关联,它可以是User 或Customer(这些不是实际模型,所以请 不要问为什么有一个多态关联,因为它显然类似于 User 模型中的布尔值 customer 列)。
当使用ActiveRecord 查询数据库时,我在Message 模型中有一个方法,它检索与某个User 关联的消息(重要的是要注意,在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 不支持查询中的双引号,即 message_ids 字符串中 owner_type 的 User 参数!我只是将方法中的行从:
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'
事情进展顺利。
【问题讨论】:
-
拒绝分享知识 - 感谢 SO 社区的支持。如果您碰巧现在正在阅读本文并计划对某些内容投反对票,请提供一些关于您认为该问题“不值得”的为什么的解释。至于这个问题,我认为有趣的是所呈现的错误令人困惑,即当“客户”甚至没有作为数据库中的列提供时,它说“客户”列不存在,只是作为一个值对于
owner_type。我认为知道如何将奇怪的错误映射到其根本原因总是值得分享的。 -
@MadM 赞成。遇到同样的问题,这对我有帮助
标签: ruby-on-rails sqlite postgresql heroku rails-activerecord