在rails迁移中组合列

时间:2014-08-20 17:45:07

标签: ruby-on-rails activerecord rails-migrations

我正在编写ActiveRecord迁移,将单个名称属性拆分为名字和姓氏。我认为下面的模式更改部分是正确的,但我是否可以使用迁移来传输现有数据?

返回情况非常简单 - 我们将first_name和amp;的内容结合起来。 last_name,以空格分隔。对于拆分,我们可以在第一个空格实例上拆分名称,并将一半保存到first_name&姓。 (我知道这是一个不稳定的假设,并且名称很挑剔 - 但它会照顾大多数情况,其余部分可以手动修复。)

class BreakUpNameColumnInAddressBook < ActiveRecord::Migration
  def up
    add_column :shipping_addresses, :first_name, :string
    add_column :shipping_addresses, :last_name, :string
    remove_column :shipping_addresses, :name
  end

  def down
    add_column :shipping_addresses, :name, :string
    remove_column :shipping_addresses, :first_name
    remove_column :shipping_addresses, :last_name
  end
end

1 个答案:

答案 0 :(得分:1)

您可以在迁移中运行您喜欢的任何代码,只需执行您需要执行的操作(未经测试,请小心):

class BreakUpNameColumnInAddressBook < ActiveRecord::Migration
  def up
    add_column :shipping_addresses, :first_name, :string
    add_column :shipping_addresses, :last_name, :string

    ShippingAddress.all.each do |address|
      fn, ln = address.name.split(' ', 2)
      address.update(first_name: fn, last_name: ln)
    end

    remove_column :shipping_addresses, :name
  end

  def down
    add_column :shipping_addresses, :name, :string

    ShippingAddress.all.each do |address|
      n = [address.first_name, address.last_name].join(' ')
      address.update(name: n)
    end

    remove_column :shipping_addresses, :first_name
    remove_column :shipping_addresses, :last_name
  end
end

Split方法在第一次出现空格后将字符串拆分为(最多)两个块。 Join方法合并数组的元素,将空格放在它们之间。