いくつかの質問を見ました(具体的にはこれです) は、SO で既存の列にデフォルトのブール値を追加する方法について説明しています。change_column
提案を試してみましたが、正しく実行できていないようです。
私は試した:
$ change_column :profiles, :show_attribute, :boolean, :default => true
返される-bash: change_column: command not found
次に私は実行しました:
$ rails g change_column :profiles, :show_attribute, :boolean, :default => true
...そして
$ rails change_column :profiles, :show_attribute, :boolean, :default => true
その後 を実行しましたrake db:migrate
が、 の値は の:show_attribute
ままでしたnil
。上で参照した質問では、PostgreSQL では手動で更新する必要があると書かれています。私は PostgreSQL を使用しているので、移行時に以下を追加しましたcreate_profiles
。
t.boolean :show_attribute, :default => true
ここで私が何を間違っているのか誰か教えてもらえますか?
ベストアンサー1
change_column
は のメソッドなActiveRecord::Migration
ので、コンソールでそのように呼び出すことはできません。
この列にデフォルト値を追加する場合は、新しい移行を作成します。
rails g migration add_default_value_to_show_attribute
次に、移行で以下を作成します。
# That's the more generic way to change a column
def up
change_column :profiles, :show_attribute, :boolean, default: true
end
def down
change_column :profiles, :show_attribute, :boolean, default: nil
end
または、より具体的なオプション:
def up
change_column_default :profiles, :show_attribute, true
end
def down
change_column_default :profiles, :show_attribute, nil
end
次に を実行しますrake db:migrate
。
すでに作成されたレコードは変更されません。これを行うには、 を作成するrake task
か、 に移動してrails console
すべてのレコードを更新する必要があります (本番環境ではお勧めしません)。
t.boolean :show_attribute, :default => true
マイグレーションに追加したときcreate_profiles
、何も行われないことが予想されます。まだ実行されていないマイグレーションのみが実行されます。新しいデータベースで開始した場合、デフォルトは true に設定されます。