Не должно быть никакой разницы с точки зрения производительности между ними.
Если вы проверите реализацию , вы увидите, что если вы передадите массив в .create
, он будет перебирать массив и вызывать .create
для каждого элемента в массиве.
module ActiveRecord
module Persistence
extend ActiveSupport::Concern
module ClassMethods
# ...
def create(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create(attr, &block) }
else
object = new(attributes, &block)
object.save
object
end
end
# ...
end
end
ActiveRecord фактически не реализует массовые вставки. Под этим я подразумеваю вставку нескольких строк в один оператор:
INSERT INTO products (name, description) VALUES ('Soap', '100% whale based.'),('Shampoo', '...')
Что может быть быстрее на порядок при достаточном количестве записей.
Но вы можете написать собственный SQL для этого:
class Product
def self.mass_insert(attributes)
values = products.map("(#{attributes[:name]}, #{attributes[:description]})").join(',')
self.connection.execute("INSERT INTO products (name, description) VALUES #{values}")
end
end
Обратите внимание, что этот простой пример НЕ очищает входные данные и уязвим для атаки SQL-инъекцией.