(Примечание: OP сообщает, что это не сработало)
Попробуйте что-то вроде этого:
previous = nil
Registration.select('service_id, regulator_id, regulator_given_id')
.order('service_id, updated_at DESC')
.each do |r|
if previous != r.service_id
service = Service.find r.service_id
service.update_attributes(:regulator_id => r.regulator_id, :regulator_given_id => r.regulator_given_id)
previous = r.service_id
end
end
Это своего рода хакерский способ получения самой последней записи из regulators
- несомненно, есть лучший способ сделать это с DISTINCT
или GROUP BY
в SQL, все в одном запросе, который не только быть намного быстрее, но и более элегантным. Но это просто миграция, верно? И я не обещал элегантного. Я также не уверен, что это сработает и решит проблему, но я думаю так: -)
Ключевое изменение заключается в том, что вместо использования SQL используется AREL, что означает (я думаю), что операция обновления выполняется один раз для каждой связанной записи , когда AREL возвращает их . С SQL вы возвращаете их все и сохраняете в массиве, а затем обновляете их все. Я также не считаю необходимым использовать предложение .select(...)
.
Очень заинтересован в результате, поэтому дайте мне знать, если он работает!