Cómo implementar la inserción masiva en Rails 3

Necesito insertar una matriz de correos electrónicos como registros diferentes en mi tabla de contactos. ¿Cómo puede hacerse esto?

Eg: @email = ["a@b.com", "c@d.com", "e@f.com", ... ] 

No quiero usar

  @email.each do |email| @contact = Contact.new @contact.email = email @contact.save end 

Esta causa n inserta requiere. Solo necesito una única consulta de inserción para insertar estos valores. ¿Cómo se puede hacer esto en Rails 3.0.9 (e idealmente MySQL). Por favor ayuda

activerecord-import implementa la importación AR #

activerecord-import es una biblioteca para insertar datos a granel utilizando ActiveRecord.

mira cómo funciona:

 books = [] 10.times do |i| books << Book.new(:name => "book #{i}") end Book.import books 

El hogar del proyecto está en Github y es wiki .

También puede probar upsert , que es aproximadamente tan rápido como activerecord-import , pero solo funciona (actualmente) con MySQL, Postgres y SQLite3:

 require 'upsert' Upsert.batch(Contact.connection, Contact.table_name) do |upsert| emails.each do |email| upsert.row(email: email) end end 

Tenga en cuenta que esto implica una consulta de base de datos por registro, pero es un “complemento”, por lo que no tiene que comprobar si ya existe un registro. En su ejemplo, esto no es una preocupación, pero en la mayoría de las aplicaciones se convierte en uno eventualmente.

La forma más simple sin gem adicional es concaturar una cadena y ejecutarla en una inserción de SQL ( http://www.electrictoolbox.com/mysql-insert-multiple-records/ ).

 @email = ["a@b.com", "c@d.com", "e@f.com"] time = Time.current.to_s(:db) values = @email.map do |email| "('#{email}', '#{time}', '#{time}')" end sql = "INSERT INTO contacts (email, created_at, updated_at) VALUES #{values.join(', ')}" Contact.connection.execute(sql) 

Acabo de escribir un pequeño parche para Active Record 3.2 para INSERTAR muchos registros nuevos con una sola consulta SQL, compruébalo:

https://github.com/alexdowad/showcase/blob/master/activerecord/bulk_db_operations.rb