1. ホーム
  2. ruby-on-rails-3

[解決済み] 既存のRailsカラムのbooleanに:default => trueを追加する。

2022-04-30 23:42:57

質問

私はいくつかの質問(すなわち これ この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

どなたか、私が何を間違えているのか教えていただけませんか?

解決方法は?

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 => truecreate_profiles のマイグレーションは、何もしていないことが予想されます。まだ実行されていないマイグレーションのみが実行されます。もし、新しいデータベースで始めたのなら、デフォルトを true に設定するでしょう。