Mysql 在RAILS迁移的downcase中将昵称设置为name
我使用的用户模型中有name列,但现在我想添加一个昵称列,默认昵称为downcase中的用户名称。如何实现这一点?由于迁移文件是ruby文件,您也可以在迁移文件中使用rails模型Mysql 在RAILS迁移的downcase中将昵称设置为name,mysql,ruby-on-rails,ruby,rails-migrations,Mysql,Ruby On Rails,Ruby,Rails Migrations,我使用的用户模型中有name列,但现在我想添加一个昵称列,默认昵称为downcase中的用户名称。如何实现这一点?由于迁移文件是ruby文件,您也可以在迁移文件中使用rails模型 class AddNicknameToUser < ActiveRecord::Migration def up add_column :users, :nickname, :string User.find_each do |user| user.nickname = user
class AddNicknameToUser < ActiveRecord::Migration
def up
add_column :users, :nickname, :string
User.find_each do |user|
user.nickname = user.try(:name).downcase
user.save!
end
end
def down
remove_column :users, :nickname
end
end
编辑:
由于只需拆分名称的第一个单词,因此可以使用
user.try:name.split.first.downcase
class AddNicknameToUser < ActiveRecord::Migration
def change
add_column :users, :nickname, :string
User.update_all("nickname = lower(name)")
end
end
我假设你正在使用postgres。全部更新将比保存每条记录更快
对于mysql:
class AddNicknameToUser < ActiveRecord::Migration
def change
add_column :users, :nickname, :string
User.update_all("nickname = LOWER(name)")
end
end
编辑:lower和lower版本都适用于postgres和mysql 您想在迁移文件本身中实现这一切吗?或者它可以在模型中?@Sravan我希望它在迁移过程中自己完成。您想添加一个新列,并在downcase中将所有用户名的值更新为昵称,对吗?@Sravan是的correct@Sravan,我有一个问题,假设输入的名称中的列名是全名,我只想要像John Doe一样的名字,我只想要名字John是小写的昵称。实际上,我使用的是MySQL。第二个版本应该可以在MySQL和Postgres中使用。或者更好,在迁移过程中,不要使用用户模型或任何其他模型,只需执行一个简单的“更新用户集昵称=lowername”。这有助于使迁移独立于Ruby代码的当前状态,并有助于避免不愉快的问题。此外,LOWER和LOWER在SQL中是一样的,因为SQL不区分大小写。我强烈建议人们,数据库迁移永远不要使用模型代码。通常情况下,这些迁移中引用的模型会随着时间的推移而发生显著的变化,有时甚至会被删除,这使得这些代码无法正常工作,除非有人按照自己的方式进行更新。您可以更快地解决这个问题!执行更新用户集昵称=LOWERnickname,并在SQL中完成所有操作。
class AddNicknameToUser < ActiveRecord::Migration
def change
add_column :users, :nickname, :string
User.update_all("nickname = LOWER(name)")
end
end