Рельсы-6: Массовый импорт HABTM производит тысячи вставок

После нескольких часов гугления в поисках лучшей практики я пришел сюда.

У меня есть новый объект Foo, и я хочу массово назначить ему тысячи баров, которые я предварительно загрузил:

@foo = Foo.create
@bars = Bar.find_all_by_some_attribute(:a)

Какой самый быстрый способ сделать это? Я пробовал:

@foo.bars = @bars
@foo.bars << @bars

В результате создаются тысячи запросов на вставку.

Есть ли способ Rails 6 (Insert_all) решить мою проблему или мне нужно решить ее с помощью гема "m2m_fast_insert" или жестко запрограммированного SQL?


person chriskrams    schedule 08.04.2020    source источник


Ответы (1)


Если у вас есть настройка таблицы присоединения, например:

class Item < ActiveRecord::Base
  has_and_belongs_to_many :orders
end

class Order < ActiveRecord::Base
  has_and_belongs_to_many :items
end

class ItemsOrders < ActiveRecord::Base
  belongs_to :item
  belongs_to :order
end

Я полагаю, что вы могли бы вставить много ItemOrders в этом случае (или любой другой вашей модели соединения) с insert_all, который является новым в Rails 6. Если это не ваш лучший выбор, это некоторое количество пользовательского SQL. Я нашел еще один ответ на SO, который, казалось, имел хорошую отправную точку для SQL: Какой самый быстрый способ создать массовые ассоциации HABTM в Rails?

person sevensidedmarble    schedule 09.04.2020