1

sqliteで正常に動作していたRailsアプリがありますが、postgreに切り替えると、このクエリで問題が発生します。

User.find(1).ratings

作品だけを検索する、例えば

User.find(1)

を生成します

SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]

ただし、このように評価を追加すると、次のようになります。

User.find(1).ratings

を生成します

  User Load (1.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Rating Load (0.9ms)  SELECT "ratings".* FROM "ratings" WHERE "ratings"."user_id" = 1
PG::Error: ERROR:  operator does not exist: character varying = integer
LINE 1: ...CT "ratings".* FROM "ratings"  WHERE "ratings"."user_id" = 1
                                                                    ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "ratings".* FROM "ratings"  WHERE "ratings"."user_id" = 1
ActiveRecord::StatementInvalid: PG::Error: ERROR:  operator does not exist: character varying = integer
LINE 1: ...CT "ratings".* FROM "ratings"  WHERE "ratings"."user_id" = 1
                                                                    ^

:idをintまたはstringとして渡すかどうかに関係なく、上記のエラーが発生します。モデルは、:ratingsbelongs_toユーザー(has_many:ratings)になるように設定されています。何か案は?前もって感謝します。

バージョン:Rails 3.1.1、Ruby 1.9.2、デバイス1.5.1

4

1 に答える 1

5

このエラー

エラー:演算子が存在しません:文字の変化=整数

通常、2つの異なるデータ型を比較して同等であるかどうかを比較しようとしていることを意味します。一部のプラットフォームでは、一方を他方にサイレントに強制することでそれを実行できます。SQLiteはそうします、そしてそれはあなたにSQL標準に準拠していない多くのことをさせます。PostgreSQLは通常、このような比較を許可しません。印刷するので

WHERE "ratings"."user_id" = 1

エラーメッセージでは、整数(1)を指定したにもかかわらず、ratings.user_id列は実際にはvarchar()であることが示されています。


SQLiteはSQLではありません。ここでは、ユニバーサルデータ型「wibble」を使用します。

sqlite> create table test (n integer not null, s wibble not null);
sqlite> insert into test values (1, 'Wibble');
sqlite> insert into test values ('Wibble', 1);
sqlite> select * from test;
1|Wibble
Wibble|1

SQLiteは、整数列に「Wibble」を挿入させてくれます。悪夢ではないにしても、それは少なくともあなたに一時停止を与えるはずです。

PostgreSQLは無料で、多くのプラットフォームで利用できます。Herokuでのデプロイを期待しているのであれば、SQLiteを使用する代わりにPostgreSQLをインストールしてそれに対して開発しない理由はわかりません。

于 2012-05-03T01:44:25.347 に答える