ruby on rails - instalar - Cómo implementar la inserción masiva en Rails 3
ruby on rails tutorial (4)
Necesito insertar una matriz de correos electrónicos como registros diferentes en mi tabla de contactos. ¿Cómo puede hacerse esto?
Eg: @email = ["[email protected]", "[email protected]", "[email protected]", ... ]
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
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
La forma más simple sin gema adicional es concaturar una cadena y ejecutarla en una inserción de SQL ( http://www.electrictoolbox.com/mysql-insert-multiple-records/ ).
@email = ["[email protected]", "[email protected]", "[email protected]"]
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)
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.
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