2

みんな。Heroku でデータベース (postgre) の移行を実行しようとしていますが、実行すると次のエラーが発生します。

PGError: エラー: 列 "morning_meds" は型 "pg_catalog.bool" にキャストできません: ALTER TABLE "users" ALTER COLUMN "morning_meds" TYPE boolean

問題の移行ファイルには次のコードがあります。

class ChangeUserMedsFieldsToBoolean < ActiveRecord::Migration
  def down
    change_column :users, :morning_meds, :string
    change_column :users, :lunch_meds, :string
    change_column :users, :night_meds, :string
  end

  def up
    change_column :users, :morning_meds, :boolean
    change_column :users, :lunch_meds, :boolean
    change_column :users, :night_meds, :boolean
  end
end

エラーを修正する方法やエラーの原因がわからないので、何か助けていただけると助かります。

4

1 に答える 1

3

Rails は、キャストまたは変換関数を指定するためのサポートを提供していないようです。これは、PostgreSQL がその型ペアの暗黙的なキャストが存在しないデータ型の変更に必要です。

Rails を実行する必要があります。

ALTER TABLE users ALTER COLUMN col_name SET DATA TYPE morning_meds USING bool(col_name)

また、Rails ではUSINGマイグレーションを介して句を指定できないようであるため、手動で指定する必要があります。この優れた回答を参照してください。

または、移行前に次を実行することもできます。

CREATE FUNCTION bool(text) RETURNS BOOLEAN AS $$
SELECT bool($1); 
$$ LANGUAGE 'sql';

CREATE CAST (text AS boolean) WITH FUNCTION bool(text) AS IMPLICIT;

USINGこれにより、明示的な句なしで ALTER を続行できます。移行後にキャストと bool(text) 関数を削除できます。おそらく削除する必要があります。

DROP CAST (text AS boolean);
DROP FUNCTION bool(text);
于 2012-08-16T02:36:15.327 に答える