私は周りを検索していくつかの同様の検索を見つけましたが、私が抱えていた問題を実際に詳述したものではなかったので、私は自分の発見を共有したいと思いました。
問題
RubyonRailsプロジェクトをHeroku(DB = PostgresQL )にプッシュすると、開発環境( DB = SQLite )では受信しなかったエラーが発生しました。
詳細
たとえばMessage
、またはとのポリモーフィックな関連付けを持つモデルがあります。これは、またはowner
のいずれかです(これらは実際のモデルではないため、明らかにポリモーフィックな関連付けがあるのに、なぜポリモーフィックな関連付けがあるのかを尋ねないでください。モデルのブール列)。User
Customer
customer
User
を使用してDBにクエリを実行すると、特定のメッセージに関連付けられたメッセージを取得ActiveRecord
するメソッドがモデルにありました(この場合、のポリモーフィックな関連付けでは、モデルは2つの列を追加します。または)_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はクエリでの二重引用符、つまり文字列での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'
そして、物事は順調に進みました。