Создайте несколько записей Rails ActiveRecord за один вызов / запрос - PullRequest
4 голосов
/ 10 июня 2011

В одном из классов AR моих приложений на Rails я получил массив из множества недавно инициализированных объектов ActiveRecord.

Я хочу иметь возможность эффективно сохранять их в БД, в идеалев одном вызове метода.На данный момент я завернул их в транзакцию.

Что-то вроде:

Object.transaction do
  @objects.map(&:save)
end

Есть ли более эффективное решение для создания / обновления массива записей?

Ответы [ 2 ]

7 голосов
/ 10 июня 2011

Вы правильно делаете, что все заключаете в транзакцию, потому что тогда база данных очищается и обновляет индексы только один раз.

Нельзя вставить много объектов в один оператор SQL в стандартном SQL.MySQL может сделать это, но это не по умолчанию.Я сомневаюсь, что это дает огромное преимущество в производительности.

Если этот код действительно критичен ко времени, вы можете запустить его асинхронно (переместив его в фоновый поток - обратите внимание, что есть проблемы с ActiveRecord и многопоточностью - илипусть он будет выполнен работником. Или вы можете сгенерировать SQL вручную - AR не очень эффективен при этом. Однако я бы пошел по этому пути, только если это крайне важно, и рассмотрел бы егохак тогда.

2 голосов
/ 18 ноября 2014

Я предлагаю использовать камень activerecord-import , пока основная запись activerecord не будет поддерживать массовые вставки.

Он довольно прост в использовании, например, массовая вставка набора записей "Rating":

# Example database record/model
class Rating < ActiveRecord::Base

end

ratings = []

# Create some fake data here..
100.times do |i|
    ratings << Rating.new({ stars: (rand * 5).to_i }) # random star rating
end

# Bulk import ratings (single query)
Rating.import(ratings) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...