如何合并rails表中的列?

Shi*_*amD 4 merge ruby-on-rails

我有一个用户的rails表,列first_name和last_name等.我如何将这两个合并在一起?或者我如何创建一个名为name的新列并从这两列添加数据?基本上我需要一个名为name的列,它是first_name和last_name的串联.

jvn*_*ill 6

正如Richard Brown所回答的那样,如果要将连接字符串保存到数据库,则应创建迁移.

rails g migration add_fullname_to_users fullname
Run Code Online (Sandbox Code Playgroud)

然后在生成的迁移中运行一个sql来更新所有记录

# mysql
User.update_all('fullname = CONCAT(first_name, " ", last_name)')

# postgre
User.update_all("fullname = (first_name || ' ' || last_name)")
Run Code Online (Sandbox Code Playgroud)

但我建议您保留当前的设置,只需在模型中创建一个名为fullname的方法

# user.rb
def fullname
  "{first_name} #{last_name}"
end
Run Code Online (Sandbox Code Playgroud)

这是更好的,因为你有权访问first_namelast_name


tho*_*phn 4

如果您想确保可以回滚,可以在迁移文件中执行类似的操作。

  def up
    add_column :your_table, :name, :string 

    YourClass.all.each do |person|
      person.update_attributes! :name => person.first_name + " " + person.last_name
    end

    remove_column :your_table, :first_name
    remove_column :your_table, :last_name  
  end
Run Code Online (Sandbox Code Playgroud)

以及您的回滚方法:

  def down
    add_column :your_table, :first_name, :string
    add_column :your_table, :last_name, :string

    YourClass.all.each do |person|
      person.update_attributes! :first_name => person.name.match(/\w+/)[0]
      person.update_attributes! :last_name => person.name.match(/\w+/)[1]
    end

    remove_column :your_table, :name
  end
Run Code Online (Sandbox Code Playgroud)