Обновление большого набора записей в Rails - PullRequest
0 голосов
/ 23 июля 2010

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

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

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

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

Спасибо!

Ответы [ 2 ]

5 голосов
/ 23 июля 2010

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

User.update_all(:flag => false)

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

UPDATE users SET flag = 'f'

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

Метод #update_all также принимает условия:

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 голосов
/ 23 июля 2010

Вы можете использовать метод ActiveRecord execute для выполнения обновления SQL.Как то так:

ActiveRecord::Base.connection.execute('UPDATE users SET flag=0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...