Shi*_*amD 4 merge ruby-on-rails
我有一个用户的rails表,列first_name和last_name等.我如何将这两个合并在一起?或者我如何创建一个名为name的新列并从这两列添加数据?基本上我需要一个名为name的列,它是first_name和last_name的串联.
正如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_name和last_name
如果您想确保可以回滚,可以在迁移文件中执行类似的操作。
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)