Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在Rails控制台中为许多用户更新电子邮件域名_Ruby_Ruby On Rails 3_Activerecord_Rails Activerecord - Fatal编程技术网

Ruby 在Rails控制台中为许多用户更新电子邮件域名

Ruby 在Rails控制台中为许多用户更新电子邮件域名,ruby,ruby-on-rails-3,activerecord,rails-activerecord,Ruby,Ruby On Rails 3,Activerecord,Rails Activerecord,我有一个用户模型,其中有一个电子邮件地址user@domain.com 我想做的是能够更新系统中的所有用户,将他们的域名从@domain.com更改为@newdomain.com 是否有某种方法可以运行命令(update_all)或类似的命令,只查找结尾部分(@domain.com),并将所有记录的结尾部分更改为@newdomain.com 如果我必须通过控制台或Rails_Admin一个接一个地执行此操作,我会的,只是希望有一种通过编程实现的方法。您可以迭代所有用户并使用gsub更新地址,如:

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

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

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


如果我必须通过控制台或Rails_Admin一个接一个地执行此操作,我会的,只是希望有一种通过编程实现的方法。

您可以迭代所有用户并使用
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.where("email LIKE '%@domain.com'").find_each do |user|
  user.update_attributes(
    email: user.email.sub('@domain.com', '@newdomain.com')
  )
end

我试着在Rails控制台上执行此操作,匹配我的模型和电子邮件字段名,当我点击enter时,控制台将不返回任何内容。是的,我包括了一个结束语:)有什么想法吗?你可以用一行来表达,但语法稍有不同:
User.all.each{User | User.email=User.email.gsub('@domain.com','@newdomain.com');User.save!}
Gotcha,这就是我的想法。我需要对控制台更友好一些。我通常把它用于简单的事情,而不是像这样的任务。我感谢你的帮助:)