我有一个名为resource_schedules
的表,其中包含:
t.string :active_patient_ids, array: true, default: []
我想将其转换为:
t.integer :active_patient_ids, array: true, default: []
我已经创建了一个迁移文件,这里是我放在其中的代码:
def up
change_column :resource_schedules, :active_patient_ids, :integer
end
def down
change_column :resource_schedules, :active_patient_ids, :string
end
然后我运行了这个命令:
rake db:migrate
关键是我的active_patient_ids
仍然是一个字符串数组。
答案 0 :(得分:0)
在上面的迁移过程中,您实际上并没有更改表中内容的数据类型。如果表格中已存在数据,您将很难通过迁移在数据类型之间进行转换。我建议创建一个新的空int表,然后使用string.to_i
手动将数据从字符串表迁移到int表。
答案 1 :(得分:0)
您还需要迁移数据。由于您要使用相同的列名,因此您应该能够重命名现有列,使用以前的名称添加新列,然后迁移数据。
我还没有对此进行测试,但我之前使用过类似的东西。请在尝试之前备份您的数据库。
def up
rename_column :resource_schedules, :active_patient_ids, :active_patient_id_strings
add_column :resource_schedules, :active_patient_ids, :integer
ResourceSchedule.each do |schedule|
schedule.active_patient_ids = schedule.active_patient_id_strings.map { |s| s.to_i }
schedule.save
end
remove_column :resource_schedules, :active_patient_id_strings
end