将一个字符串数组列转换为rails中的整数列数组

时间:2015-07-01 22:26:12

标签: ruby-on-rails

我有一个名为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仍然是一个字符串数组。

2 个答案:

答案 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