1

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

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

详细信息
我有一个模型,例如Message,与模型中的布尔列)。ownerUserCustomercustomerUser

使用查询数据库时,ActiveRecord我在模型中有一个方法,该方法Message检索与某个关联的消息User(重要的是要注意,在 a 的多态关联中owner,在这种情况下,模型将Message添加两列,owner_id并且是或)owner_typeowner_typeUserCustomer

该方法定义如下:

    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_typemessage_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'

事情进展顺利。

4

1 回答 1

1

解决方案
我没有意识到在查询中使用单引号或双引号时,某些查询语言(如 SQL、PostgresQL 等)不像 SQLite 那样宽容。具体来说,PostgresQL 不支持查询中的双引号,即字符串中的User参数!我只是将方法中的行从:owner_typemessage_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'

事情进展顺利。

于 2013-02-20T18:49:04.247 回答