在Rails中更新大型记录集

Kev*_*ker 0 activerecord ruby-on-rails

我需要更新大量记录中的单个字段.通常,我只是从控制台运行快速SQL更新语句并完成它,但这是一个最终用户需要能够在此应用程序中运行的实用程序.

所以,这是我的代码:

users = User.find(:all, :select => 'id, flag')
users.each do |u|
  u.flag = false
  u.save
end
Run Code Online (Sandbox Code Playgroud)

我担心随着用户数量的增加,这只需要一段时间(目前大约在35k左右,每周增加2-5k).有更快的方法吗?

谢谢!

Fra*_*eil 5

如果您真的想要更新所有记录,最简单的方法是使用#update_all:

User.update_all(:flag => false)
Run Code Online (Sandbox Code Playgroud)

这相当于:

UPDATE users SET flag = 'f'
Run Code Online (Sandbox Code Playgroud)

(确切的SQL将根据您的适配器而有所不同)

#update_all方法也接受条件:

User.update_all({:flag => false}, {:created_on => 3.weeks.ago .. 5.hours.ago})
Run Code Online (Sandbox Code Playgroud)

此外,#update_all可以与命名范围组合:

class User < ActiveRecord::Base
  named_scope :inactive, lambda {{:conditions => {:last_login_at => 2.years.ago .. 2.weeks.ago}}
end

User.inactive.update_all(:flag => false)
Run Code Online (Sandbox Code Playgroud)