Эффективность активной записи Rails: модель.Создать внутри блока против модели.Создать (массив)

#ruby-on-rails #activerecord

#ruby-on-rails #activerecord

Вопрос:

Будет ли одно из следующих действий более эффективным?

 #Array is an array of hashes


Array.each do |a|
  #some logic to clean up the record for creation
  Model.create!(a)
end
  

против.

 Array.each_with_index do |a,i|
  #some logic to clean up the Array for creation
end
Model.create!(Array)
  

Ответ №1:

Исходя из исходного кода, выполняется проверка, которая выполняет сбор коллекции, а затем рекурсивно вызывает create . В этом случае вы были бы более эффективны с первым методом, поскольку он использует меньше операций и будет выполнять is_a?(Array) проверку только один раз.

Исходный код:

 # File activerecord/lib/active_record/base.rb, line 504
def create(attributes = nil, options = {}, amp;block)
  if attributes.is_a?(Array)
    attributes.collect { |attr| create(attr, options, amp;block) }
  else
    object = new(attributes, options)
    yield(object) if block_given?
    object.save
    object
  end
end