Mysql 在RAILS迁移的downcase中将昵称设置为name

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

我使用的用户模型中有name列,但现在我想添加一个昵称列,默认昵称为downcase中的用户名称。如何实现这一点?

由于迁移文件是ruby文件,您也可以在迁移文件中使用rails模型

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