使用Model方法在迁移期间填充列

时间:2014-02-28 20:42:15

标签: ruby-on-rails ruby-on-rails-4 rails-migrations

我想在我的users表中添加一个新列,并使用随机令牌填充它。我有这个工作,但我很好奇为什么我尝试的第一种方法不起作用。

以下是我的迁移的工作版本:

class AddTokenToUser < ActiveRecord::Migration
  def up
    add_column :users, :secure_token, :string
    User.reset_column_information
    User.all.each do |user|
      user.secure_token = SecureRandom.urlsafe_base64(16)
      user.save!
    end
  end

  def down
    remove_column :users, :secure_token
  end
end

但是,因为我也希望代码在User模型上生成这个令牌,因为我想和每个新用户一起创建一个新令牌,我想我可以添加代码作为User对象的方法:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :snaps

  def generate_new_secure_token
    @secure_token = SecureRandom.urlsafe_base64(16)
  end
end

...然后从迁移中调用它,以避免重复自己:

class AddTokenToUser < ActiveRecord::Migration
  def up
    add_column :users, :secure_token, :string
    User.reset_column_information
    User.all.each do |user|
      # user.secure_token = SecureRandom.urlsafe_base64(16)
      user.generate_new_secure_token
      user.save!
    end
  end

  def down
    remove_column :users, :secure_token
  end
end

但是,使用这种方法,我没有得到任何错误,但我的secure_token列值在数据库中最终都为NULL,而不是在其中包含一个令牌。

我是Rails和Ruby的新手,所以我觉得我错过了一些明显的东西,但我看不出它是什么。为什么我的方法不起作用,并且有一种将令牌生成例程移动到User类的好方法,所以我不需要在两个不同的位置使用它?

1 个答案:

答案 0 :(得分:3)

将您的方法更改为此

  def generate_new_secure_token
    self.secure_token = SecureRandom.urlsafe_base64(16)
  end

@secure_token是一个实例变量。设置不会更改用户对象上的属性secure_token