0

我在 Rails 迁移中将一列(“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 也不起作用。

值得一提的是,我已经应用了此迁移的先前版本一次,并且在回滚后(“向下”方法为空)我试图再次应用它。因此,数据库模式当前不包含“old_name”,因为它没有物理还原。

4

1 回答 1

1

我最近遇到了同样的问题,我发现不是 Rails 导致了问题,而是数据库中的更新触发器仍在引用旧的列名。

删除了触发器的那一部分,迁移就完成了。

于 2012-10-23T13:27:09.600 回答