2010-07-23 4 views
0

Мне нужно обновить одно поле в большом наборе записей. Обычно я просто запускаю инструкцию быстрого обновления SQL из консоли и выполняю ее, но это утилита, которую конечные пользователи должны иметь возможность запускать в этом приложении.Обновление большого набора записей в Rails

Итак, вот мой код:

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

Я боюсь, что это только собирается занять некоторое время, как число пользователей увеличивается (ток, сидя около 35к, добавив 2-5k в неделю). Есть ли более быстрый способ сделать это?

Спасибо!

ответ

5

Если вы действительно хотите обновить все записи, самый простой способ заключается в использовании #update_all:

User.update_all(:flag => false) 

Это эквивалент:

UPDATE users SET flag = 'f' 

(The точный SQL будет отличаться в зависимости от вашего адаптера)

Метод #update_all также accep Т.С. условия:

User.update_all({:flag => false}, {:created_on => 3.weeks.ago .. 5.hours.ago}) 

Также #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) 
0

Для выполнения SQL-запроса обновления можно использовать метод execute ActiveRecord. Что-то вроде этого:

ActiveRecord::Base.connection.execute('UPDATE users SET flag=0') 
Смежные вопросы