Как действительно быстро сохранить массив объектов в базе данных в Rails3? - PullRequest
0 голосов
/ 27 июля 2011

У меня действительно большой массив объектов, считанных из файла CSV, и я хочу сохранить его в базе данных. Вот что я делаю:

# Read CSV
... each do |values|
  new_value = Model.new
  ... # fill properties
  @new_values.push new_value # put it into the array
end

# now save them to the database
@new_values.each do |new_value| 
    new_value.save :validate => false
    @added_counter += 1
end

Но это действительно медленно, потому что он делает оператор для каждого элемента в массиве. Как это можно сделать быстро и правильно?

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Может быть activerecord-import может быть полезно для вас.

Это позволяет сделать что-то вроде:

books = []
10.times do |i| 
  books << Book.new(:name => "book #{i}")
end
Book.import books
0 голосов
/ 28 июля 2011

Это решение, основанное на комментариях mu слишком короткое (Спасибо!). Я использую ручной SQL-оператор и выполняю его.

  insert_statement = "INSERT INTO table_name (custom_property_from_parameter"
  # the properties from the model are fetched by a method, to keep it a little bit generic, loop trough them and give their names to the statement
  Model.parameter_names.each do |parameter|
    insert_statement += "," + parameter
  end
  insert_statement += ") VALUES "
  @new_values.each do |new_value|
    insert_statement += "(" + params[:custom_property]
    Model.parameter_names.each do |parameter|
      # Rails' nil has to be converted into NULL for SQL
      if nil == new_value.send(parameter)
        insert_statement += ",NULL"
      else
        insert_statement += "," + new_value.send(parameter).to_s
      end
    end
    insert_statement += "),"
    @added_counter += 1
  end
  # Remove the last , with ;
  insert_statement = insert_statement[0..-2]
  insert_statement += ";"
  # now execute the statement
  ActiveRecord::Base.connection.execute insert_statement

Это решение занимает примерно треть времени. Но для меня это немного похоже на взлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...