Ruby on rails 在记录已存在后向数据库列添加信息

Ruby on rails 在记录已存在后向数据库列添加信息,ruby-on-rails,ruby-on-rails-3,rake,Ruby On Rails,Ruby On Rails 3,Rake,我有一个在Heroku中运行的应用程序。该应用程序有一个带有电子邮件、密码和其他一些列的用户模型。我最近在本地向数据库添加了更多列,包括一个随机令牌列,它是每个用户的唯一令牌。创建用户时,将在用户模型中运行以下代码: before_create :set_referer_url ... private def set_referer_url begin self.referer_url = rand(36**8).to_s(36) end while User.exist

我有一个在Heroku中运行的应用程序。该应用程序有一个带有电子邮件、密码和其他一些列的用户模型。我最近在本地向数据库添加了更多列,包括一个随机令牌列,它是每个用户的唯一令牌。创建用户时,将在用户模型中运行以下代码:

before_create :set_referer_url

...

private 

def set_referer_url
  begin
    self.referer_url = rand(36**8).to_s(36)
  end while User.exists?(:referer_url => self.referer_url)
end
对于创建的任何新用户,他们将拥有此唯一令牌。但是,较老的用户不会。我想将这个迁移(使用新的数据库列)推送到heroku。如何为添加此新列之前创建的用户添加此令牌。我听说过很多关于rake的事,但是如果有任何帮助,我将不胜感激

另一方面,我尝试通过以下操作从rails控制台本地为测试用户添加令牌:

User.find_by_email('xyz').set_referer_url

然而,这导致了一个命名方法错误:private方法。如何在rake中调用私有方法?为了使用填充的新令牌列设置老用户,整个rake过程是什么样子的?

要从对象外部调用私有方法,请使用
send

User.find_by_email('xyz').send(:set_referer_url)

当然,这样做通常是不好的做法,因为私有方法是私有的是有原因的。但对于作为迁移一部分的现有数据的一次性回填,我认为还可以。

谢谢!但是,在整个用户模型的rake任务中,我该如何管理这一点呢?您可以遍历在更改之前创建的每个用户,并对其调用该方法-但是如果您有很多用户,这可能是一个非常糟糕的主意。你可能想分批做。