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