0

Railsの移行で、1つの列の名前を変更し(「old_name」から「new_name」に)、他の列(「column2」)を整数からブール値に変換しています:

def up
  rename_column :my_models, :old_name, :new_name unless column_exists?(:my_models, :new_name)
  ...........
  if column_exists?(:my_models, :column2) && !column_exists?(:my_models, :column2_num) && MyModel.columns_hash['column2'].type==:integer
    rename_column :my_models, :column2, :column2_num
    add_column :my_models, :column2, :boolean, :null => false, :default => true

    MyModel.reset_column_information

    MyModel.all.each do |item|
      item.column2 = (item.column2_num!=0)
      item.save!
    end
    remove_column :my_models, :column2_num
  end
  ...........
end

rake db:migrate の結果:

undefined method `old_name' for #<MyModel:0x4ff4238>

「保存!」でエラー発生 方法。

私も試しました:

MyModel.connection.schema_cache.clear!
MyModel.reset_column_information

idも機能しません。

この移行の以前のバージョンを 1 回適用し、ロールバック (「ダウン」メソッドが空) した後、再度適用しようとしていることは言うまでもありません。そのため、物理的に元に戻されていないため、データベース スキーマには現在 "old_name" が含まれていません。

4

1 に答える 1

1

私は最近同じ問題を抱えていましたが、Rails が問題を引き起こしているのではなく、古い列名をまだ参照しているデータベースの更新トリガーであることがわかりました。

トリガーのその部分を削除すると、移行が完了しました。

于 2012-10-23T13:27:09.600 に答える