Лучший способ вставить немодельные данные, используя ActiveRecord в Rails 3?

Я импортирую данные в проект Rails 3. У меня есть 2 немного разных сценария. Я хотел бы знать, есть ли лучший способ.

Сценарий № 1

  1. Я выполняю динамически генерируемый SQL, используя DBI:ODBC. (DBI, поскольку ActiveRecord не поддерживает эту базу данных.)
  2. Я перебираю набор результатов и вставляю данные в немодельную таблицу, используя ActiveRecord.

Оператор вставки генерируется с использованием форматирования строки Ruby следующим образом:

while row = result.fetch do
  values = row.to_a     
  insert_sql = "insert into table (column1, column2) values (%s, %s)" % values
  ActiveRecord::Base.connection.execute insert_sql
end

Есть лучший способ сделать это? Я не слишком заинтересован в использовании форматированных строк.

Сценарий № 2

Сценарий № 2 похож на № 1... Вместо того, чтобы получать данные из DBI, он приходит из файла CSV. Таким образом, в этом случае данные являются текстовыми (или строками). Опять же, я использую оператор вставки со спецификаторами% s и вставляю в немодельную таблицу с помощью ActiveRecord.

Есть ли способ лучше?

1 ответ

Это зависит от. Если вам нужно вставить много строк и вам не нужна проверка ActiveRecord, ваш подход кажется правильным. Тем не менее, это будет работать значительно быстрее, если вы вставите более одной записи за раз, например так:

values = []
values << row while row = result.fetch
values_string = values.map{|v| "({v.join(',')})"}.join(',')
insert_sql = "insert into table (column1, column2) values #{value_string}"
ActiveRecord::Base.connection.execute insert_sql

Если вы предпочитаете проходить валидацию, вам нужно будет перевести каждую строку ваших источников данных в объект ActiveRecord. Обеспечивая проверки и обратные вызовы, этот подход НАМНОГО медленнее.

Другие вопросы по тегам