Один из двух ответов, найденных где-то еще: Берлингтон .
Эти два - ваш лучший выбор для производительности
Я думаю, что лучшим выбором для производительности будет использование SQL и массовая вставка нескольких строк в запросе. Если вы можете построить оператор INSERT, который делает что-то вроде:
INSERT INTO foos_bars (foo_id, bar_id) ЗНАЧЕНИЯ (1,1), (1,2), (1,3) ....
Вы должны быть в состоянии вставить тысячи строк в одном запросе. Я не пробовал ваш метод mass_habtm, но кажется, что вы могли бы что-то вроде:
bars = Bar.find_all_by_some_attribute(:a)
foo = Foo.create
values = bars.map {|bar| "(#{foo.id},#{bar.id})"}.join(",")
connection.execute("INSERT INTO foos_bars (foo_id, bar_id) VALUES
#{values}")
Кроме того, если вы ищете Bar по параметру some_attribute, убедитесь, что это поле проиндексировано в вашей базе данных.
OR
Вы все еще можете взглянуть на activerecord-import. Это верно, что это не работает без модели, но вы можете создать модель только для импорта.
FooBar.import [:foo_id, :bar_id], [[1,2], [1,3]]
Приветствия