2

走る:

Railsは移行を生成しますAddHidemsgColumnToPublishershide_msg:boolean

次のファイルが作成されました:

class AddHidemsgColumnToPublishers < ActiveRecord::Migration
  def change
    add_column :publishers, :hide_msg, :boolean
  end
end

hide_msgデフォルト値をfalseに設定したい。

だから私は試しました:

Railsは移行を生成しますadd_default_value_to_hide_msg

class AddDefaultValueToHideMsg < ActiveRecord::Migration
  def up
    change_column :publishers, :hide_msg, :boolean, :default => false
  end

  def down
    change_column :publishers, :hide_msg, :boolean, :default => nil
  end
end

しかし、エラーが発生しました:

rake db:migrate
==  AddHidemsgColumnToPublishers: migrating ===================================
-- add_column(:publishers, :hide_msg, :boolean, {:default=>false})
rake aborted!
An error has occurred, this and all later migrations canceled:

PG::Error: ERROR:  column "hide_msg" of relation "publishers" already exists
: ALTER TABLE "publishers" ADD COLUMN "hide_msg" boolean DEFAULT 'f'
4

2 に答える 2

5

単なる提案です。後で変更したい場合に問題が発生する可能性があるため、データベースにデフォルト値を設定しないでください。

モデルにセットした方がいいと思います。

before_save :set_default_high_msg
def set_default_high_msg
  self.high_msg ||= false
end

またはあなたのコントローラーでさえ:

 def new
   @publisher = Publisher.new
   @publisher.high_msg ||= false
 ...
 end
于 2013-02-06T17:02:13.747 に答える
1
rake db:migrate
==  AddHidemsgColumnToPublishers: migrating ===================================
-- add_column(:publishers, :hide_msg, :boolean, {:default=>false})

上記のことは、すでに存在するcolimnを作成しようとしていることを意味します。クラス名を確認するとAddHidemsgColumnToPublishers。これは、価値のない最初の移行を実行しようとしていることを意味しdefaultます。これは、あなたが何か間違ったことをしていることを明確に示しています。

publishersすでに列がありますhide_msg。したがって、コンソールで確認してtable descriptionくださいdb。に値がない場合は、hide_msg手動dropで列を実行して、を再実行できrake db:migrateます。または、その列をそのままにして、移行を作成して追加することもできdefault valueます。

change_column_default :publishers, :hide_msg, false

Doc:http ://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default

于 2013-02-06T16:39:19.317 に答える