我正在编写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
答案 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