Лучший способ вставить немодельные данные, используя ActiveRecord в Rails 3? - PullRequest
0 голосов
/ 17 июня 2011

Я импортирую данные в проект 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 Ответ

0 голосов
/ 17 июня 2011

Это зависит.Если вам нужно вставить много строк и вам не нужна проверка из 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.Обеспечивая проверки и обратные вызовы, этот подход НАМНОГО медленнее.

...