【问题标题】:Adding information to database columns after record already exists记录已存在后向数据库列添加信息
【发布时间】:2011-12-02 23:19:26
【问题描述】:

我有一个在 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

但是,这导致了 NoMethod 错误:私有方法。如何在 rake 中调用私有方法?为了使用填充的新令牌列设置旧用户,整个 rake 过程会是什么样子?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rake


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!不过,我将如何在整个用户模型的 rake 任务中管理它?
    • 好吧,您可以遍历更改之前创建的每个用户并在其上调用方法 - 但如果您有很多用户,这可能是一个非常糟糕的主意。您可能希望分批进行。
    猜你喜欢
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多