在一个迁移Rails中添加、填充表列



我正在努力实现这样的迁移:

class AddColumn1AndColumn2ToModel < ActiveRecord::Migration[5.2]
def change
change_table :models do |t|
t.string :column1, default: "FFFFFFFF"
t.integer :column2
end

Model.where(name: 'Name1').each{|model| model.update_columns(column1: '00000000', column2: 1)}
Model.where(name: 'Name2').each{|model| model.update_columns(column1: '00000000', column2: 1)}
Model.where(name: 'Name3').each{|model| model.update_columns(column1: 'FFFFFFFF', column2: model.mod_index.to_i(16))}
end
end

但我得到这样一个错误:

== 20210503012429 AddColumn1AndColumn2ToModel: migrating ========
-- change_table(:models)
-> 0.0038s
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
can't write unknown attribute `column1`

我尝试将Change_table更改为add_column,但错误是相同的。

add_column :models, :column1, :string, default: 'FFFFFFFF' 
add_column :models, :column2, :integer

如何在迁移中将列添加到表中并立即更改它们?

您可以试试#reset_column_information。可能是旧的模式信息还在缓存中。

class AddColumn1AndColumn2ToModel < ActiveRecord::Migration[5.2]
def change
change_table :models do |t|
t.string :column1, default: "FFFFFFFF"
t.integer :column2
end
Model.reset_column_information

Model.where(name: 'Name1').each{|model| model.update_columns(column1: '00000000', column2: 1)}
Model.where(name: 'Name2').each{|model| model.update_columns(column1: '00000000', column2: 1)}
Model.where(name: 'Name3').each{|model| model.update_columns(column1: 'FFFFFFFF', column2: model.mod_index.to_i(16))}
end
end

最新更新