Rails迁移—非静态默认值



我有一个关于在Rails迁移中将列的默认值设置为非静态值的快速问题。

我有一个"Users"表,其中已经有列id、first_name和last_name,我想添加一个名为"username"的新列,默认为用户的姓。这是我目前拥有的:

class AddLoginToUsers < ActiveRecord::Migration
  def change
    add_column :users, :username, :string, :default => :last_name
  end
end

显然,这不会产生预期的结果(默认为字符串"last_name")。如何将默认值设置为行last_name值?

提前感谢。

不确定您可以这样做,您可以在User模型中添加before_validationbefore_save回调:

class User < ActiveRecord::Base
  before_validation :create_username_if_missing
  private
  def create_username_if_missing
    self.username = last_name unless username
  end
end

并在添加回调后更新所有现有用户:

User.where("username is null").each do |user|
  user.update_attributes(username: user.last_name)
end

最新更新