1

私は周りを検索していくつかの同様の検索を見つけましたが、私が抱えていた問題を実際に詳述したものではなかったので、私は自分の発見を共有したいと思いました。

問題
RubyonRailsプロジェクトをHeroku(DB = PostgresQL )にプッシュすると、開発環境( DB = SQLite )では受信しなかったエラーが発生しました。

詳細
たとえばMessage、またはとのポリモーフィックな関連付けを持つモデルがあります。これは、またはownerのいずれかです(これらは実際のモデルではないため、明らかにポリモーフィックな関連付けがあるのに、なぜポリモーフィックな関連付けがあるのか​​を尋ねないでください。モデルのブール列)。UserCustomercustomerUser

を使用してDBにクエリを実行すると、特定のメッセージに関連付けられたメッセージを取得ActiveRecordするメソッドがモデルにありました(この場合、のポリモーフィックな関連付けでは、モデルは2つの列を追加します。または)_MessageUserownerMessageowner_idowner_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 に答える