Обновление нескольких полей в таблице?

День добрый!
Возник вопрос - есть такой метод:
def update
  params[:items].each do |item|
    @item = current_user.item.find_or_initialize_by(id: item[:id])
    @item.update(item)
  end
end


В параметре передается массив. Элементы которого могут уже содержаться в таблице, могут быть изменены или же еще не созданы.
Сейчас происходит большое количество запросов в БД.
Собственно вопрос, можно ли как-нибудь оптимизировать этот код?

В общем буду рад предложениям и любой помощи.
  • Вопрос задан
  • 2683 просмотра
Решения вопроса 1
AMar4enko
@AMar4enko
Апдейта каждой сущности отдельно вам не избежать, но оптимизировать можно:
- выборку сущностей, путем вытаскивания их из таблицы одним запросом через IN
- сохранение, выполнением апдейтов в транзакции

Вам стоит отказаться от find_or_initialize, сделать выборку сущностей через IN, обновить те, которые нашлись, определить id, которые не нашлись, для них создать новые и сохранить. Все это упаковать в транзакцию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы