既存の Rails 列のブール値に :default => true を追加する 質問する

既存の Rails 列のブール値に :default => true を追加する 質問する

いくつかの質問を見ました(具体的にはこれです) は、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 に設定されます。

おすすめ記事