私は最初の Rails アプリを構築していますが、この奇妙な問題に直面しています。私は、私にとって非常に便利な ENUM タイプをサポートする Postgres を使用しています。ただし、Rails はこれをサポートしていないため、移行では多くの「execute」を使用しています。それらはすべて正常に実行され、機能しているようです。私のデータベースは、pgAdmin を使って調べてみると、ちょうどいい状態です。users
現在、テーブルで3 つの ENUM 型を使用しています。
gender ('female', 'male')
interested_in ('men', 'women', 'men_and_women')
relationship_status ('single', ..., 'divorced')
アプリケーション側では、classy_enum gem を使用しています。次に、ユーザー プロファイルを更新して、すべてが機能しているかどうかを確認してみました。interested_in
最初は、いくつかの異なるロジックがあったため、編集プロファイルフォームから削除しました。すべてがうまくいきました。次に、 を追加interested_in
し、新しいタイプのロジックを更新して、フォームを再度送信しました。このエラーが発生しました:
PG::InvalidTextRepresentation: ERROR: invalid input value for enum interested_in: "0" :
UPDATE "users" SET "interested_in" = $1, "remember_token" = $2, "updated_at" = $3 WHERE "users"."id" = 1
このオプションを含まない列挙型フィールドに 0 を保存しようとすると、明らかに失敗します。だから、初めて同様のエラーを見たとき、「この 0 は一体どこから来ているの??」と思いました。しかし、Rails は値を保存する前に整数に変換していたことが判明し、数値以外の文字を含む文字列を変換するたびに、結果は 0 になります。それが再び起こっていると思います。そこで私はコンソールに行き、次のように入力しました:
2.0.0p247 :001 > User.columns_hash['interested_in'].type
=> :integer
同じコマンド for を実行してgender
nilrelationship_status
を取得すると、Rails が ENUM 型を認識しないため、意味があります。
2.0.0p247 :007 > User.columns_hash['gender'].type
=> nil
pgAdminには次のものがあります:
と
それぞれ。
postgres サーバーである Web サーバー (Pow) を再起動しようとしましたが、タイプがまだ一致しません。これはどのように可能ですか?Rails データベース アダプターはどのように機能しますか? この混乱した状況を解決するにはどうすればよいでしょうか?