2015-06-02 5 views
1

Мне нужно перебирать записи, найденные с помощью sql, и обновлять их все.ruby ​​итерация по sql-результатам

Мне нужно обновить несколько тысяч записей, а требования достаточно сложны, и я ищу записи по SQL. Код ниже работает, но есть ли способ сделать это, не выполняя несколько тысяч операторов обновления?

users = User.find_by_sql "select e.id from users e inner join accounts a on a.id = e.account_id where e.account_id not in (1955,3083, 3869)" 
users.each do |user| 
    u = User.find(user.id) 
    if u 
    u.update_attribute(:last_name, 'X') 
    end 
end 
+0

Не могли бы вы указать, используете ли вы Mysql, SQLite и т. Д.? И ваша версия Rails/Ruby? – onebree

+1

Непонятно, зачем вам «find_by_sql» здесь. 'User.joins (: accounts) .where ('users.account_id NOT IN (?)', [1955, 3083, 3869])' будет генерировать тот же запрос. –

+0

Привет Onebree. Использование Ruby 2, Rails 3.2 и mysql –

ответ

2

Это будет делать то же самое, как ваш код, но с одним UPDATE:

User.joins(:accounts) 
    .where("users.account_id NOT IN (?)", [1955, 3083, 3869]) 
    .update_all(last_name: "X") 

Вы можете найти документацию для update_allhere.

+1

В Rails 4 вы можете: 'User.where.not (account_id: [1955, 3083, 3869])' – evanbikes

+0

Спасибо, @evanbikes; Я обновил свой ответ. –

+0

И это не будет обновлять никакие другие столбцы, то есть 'updated_at'. Обычно мне нравится указывать это на 'Time.now', в зависимости от ситуации. – evanbikes

Смежные вопросы