web-dev-qa-db-ja.com

移行に伴ってテーブル列のデフォルト値を変更する

デフォルトの列値をfalseからtrueに変更しようとしています。しかし、私が実行するとrake db:migrate VERSION=904984092840298次のエラーが発生しました。

StandardError: An error has occurred, this and all later migrations canceled:

PG::InvalidTextRepresentation: ERROR:  invalid input syntax for type boolean: "---
:from: false
:to: true
"
: ALTER TABLE "plussites" ALTER COLUMN "hide_season_selector" SET DEFAULT '---
:from: false
:to: true
'

移行

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, from: false, to: true 
  end
end
11
Lory

ドキュメントによると( change_column_default )コードは機能するはずです。

オプションとして、updownを定義できます。

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
  def up
    change_column_default :plussites, :hide_season_selector, true
  end

  def down
    change_column_default :plussites, :hide_season_selector, false
  end
end
15
Andrey Deineko

使用しているActiveRecordのバージョンを確認する必要があります。あなたによるとコマンドrake db:migrateまだRails 4.2以前)を使用しています。

4.2までのActiveRecord( change_column_default 4.2.9 )を使用している場合、from/toオプションはなく、新しいデフォルトオプションのみをparamとして定義できます。

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, true 
  end
end

上記のソリューションでは、以前のデフォルト値が何であったかがメソッドにわからないため、ロールバックは許可されません。これが、個別のアップメソッドとダウンメソッドを定義する必要がある理由です。

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration
  def up
    change_column_default :plussites, :hide_season_selector, true
  end

  def down
    change_column_default :plussites, :hide_season_selector, false
  end
end

Rails 5以降を使用している場合は、from/to( change_column_default 5.0.0.1 =)。Rails 5では、選択したソリューションを使用できます。

class ChangeDefaultvalueForHideSeasonSelector < ActiveRecord::Migration 
  def change 
    change_column_default :plussites, :hide_season_selector, from: false, to: true 
  end
end

この説明が他の答えの下でコメントを持っている人々に役立つことを願っています。

3
Fa11enAngel