【问题标题】:Updating email domain name in Rails Console for many users在 Rails 控制台中为许多用户更新电子邮件域名
【发布时间】:2014-08-08 12:02:37
【问题描述】:

我有一个用户模型,其中有一个带有 user@domain.com 的电子邮件地址

我想做的是能够更新系统中的所有用户,将他们的域名从@domain.com 更改为@newdomain.com

有没有什么方法可以运行命令 (update_all) 或类似的命令,只查找结尾部分 (@domain.com) 并将所有记录的所有记录更改为 @newdomain.com?

如果我必须通过控制台或 Rails_Admin 一个一个地完成它,我会的,只是希望有一种方法可以以编程方式做到这一点。

【问题讨论】:

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


    【解决方案1】:

    只需批量迭代所有具有匹配电子邮件地址的用户,并使用新域名更新他们的电子邮件域:

    User.where("email LIKE '%@domain.com'").find_each do |user|
      user.update_attributes(
        email: user.email.sub('@domain.com', '@newdomain.com')
      )
    end
    

    【讨论】:

    • 我尝试从 Rails 控制台执行此操作,匹配我的模型和电子邮件字段名称,当我按 Enter 时,控制台不返回任何内容。是的,我包括一个结束声明:) 有什么想法吗?
    【解决方案2】:

    您可以迭代所有用户并使用gsub 更新地址,例如:

    User.all.each do |user|
      user.email = user.email.gsub('@domain.com', '@newdomain.com')
      user.save!
    end
    

    或者,如果用户数量真的很大,你应该直接在数据库中进行,一次更新查询。这取决于数据库系统,在 Postgres 中它看起来像:

    update users set email = replace(email, '@domain.com', '@newdomain.com');
    commit;
    

    【讨论】:

    • 你可以在一行中完成,但语法如果略有不同:User.all.each {|user| user.email = user.email.gsub('@domain.com', '@newdomain.com'); user.save! }
    • 明白了,我就是这么想的。我需要对控制台更加友好。我通常将它用于简单的事情,而不是这样的任务。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2015-11-10
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多