Лучший способ вставить немодельные данные, используя ActiveRecord в Rails 3?
Я импортирую данные в проект Rails 3. У меня есть 2 немного разных сценария. Я хотел бы знать, есть ли лучший способ.
Сценарий № 1
- Я выполняю динамически генерируемый SQL, используя DBI:ODBC. (DBI, поскольку ActiveRecord не поддерживает эту базу данных.)
- Я перебираю набор результатов и вставляю данные в немодельную таблицу, используя 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. Обеспечивая проверки и обратные вызовы, этот подход НАМНОГО медленнее.