【问题标题】:Create first_name and last_name from full_name in a Rails migration在 Rails 迁移中从 full_name 创建 first_name 和 last_name
【发布时间】:2016-01-06 05:15:33
【问题描述】:

我有一个包含全名列的表 (People),但想将其拆分为名字(如果存在,则为首字母)列和姓氏列。

这是一个 PostgreSQL 数据库 FWIW。我正在创建列,所以如果可能的话,这一切都可以在迁移中完成。这些名称都符合旧的标准美式风格,即没有复合名称或连字符。首字母后没有句点,并且一些名字只是首字母。这将是一次性更改,然后任何新条目将在其单独的字段中是名字和姓氏。将删除全名字段。

感谢您的帮助

【问题讨论】:

  • 请编辑您的问题以包含您目前编写的代码。

标签: sql ruby-on-rails postgresql rails-migrations


【解决方案1】:

你可以在单个迁移中这样做

创建两个新列

add_column :people, :first_name, :string
add_column :people, :last_name, :string

然后

  full_names = People.all.map(&:full_name)

它返回full_name ['full_name','full_name1',..etc] 的新数组

然后

full_names.each do |n| People.create(first_name:n.split('_')[0],
                                     last_name:n.split('_')[1])
end 

并删除全名列

remove_column :people, :full_name 

笨拙的解决方案,但应该可以工作

【讨论】:

  • 谢谢。不得不更改为names = Person.all.map(&:name)。名称是我的全名。但后来我得到了一个新列 first_name 填充了全名,最糟糕的是,这创建了一组新条目。所以在某种程度上它们是重复的,但相关的字段不存在。所以我看到了两个问题,解析不起作用,并且创建了一组全新的条目。但这可能会让我开始寻找解决方案。对我来说比尝试做 SQL 更容易。但首先我必须放弃新项目。
  • rails generate migration RemoveLastNameFromPeople last_name:string given_name:string 删除了列,但没有删除添加的条目。
【解决方案2】:

确保不要将表架构(数据包含哪些列)与实际数据(包含这些列的行)混为一谈。

现在为什么删除last_name 不会删除任何 是否有意义。它将保留所有行,但从所有行中删除该列。

所以,正如@xxx 所说,添加列(迁移架构),然后填充它们(迁移数据)。

如果您想清理从拙劣的迁移中创建的所有这些额外记录,真可惜,请务必在运行迁移之前备份您的数据库。 ;)

但也许是一个更有帮助的答案:您可以使用 created_at 日期来查找作为您第一次迁移的一部分创建的所有记录,然后删除它们。类似的东西

# e.g. if you want to delete all records created since 
# your migration which you ran 2 days ago
People.where("created_at > ?", 2.days.ago).destroy_all

在尝试之前请务必备份您的数据库...

然后,回到您最初的问题,如何将数据从单个姓名字段迁移到名字/姓氏。添加新列后,尝试像这样迭代每个人:

People.each do |person|
  new_first_name, new_last_name = person.name.split
  person.update_attributes(
    first_name: new_first_name,
    last_name: new_last_name
  ) 
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多