Come implementare l’inserimento di massa in Rails 3

Devo inserire una serie di email come record diversi nella tabella dei miei contatti. Come si può fare.

Eg: @email = ["[email protected]", "[email protected]", "[email protected]", ... ] 

Non voglio usare

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

Questa causa n inserisce i quesiti. Ho solo bisogno di una singola query di inserimento per inserire questi valori. Come può essere fatto in rails 3.0.9 (e idealmente MySQL). Per favore aiuto

activerecord-import implementa AR # import

activerecord-import è una libreria per l’inserimento di massa dei dati usando ActiveRecord.

vedere come funziona:

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

La casa del progetto è su Github e è wiki .

Puoi anche provare upsert , che è approssimativamente veloce come activerecord-import , ma funziona solo (attualmente) con MySQL, Postgres e SQLite3:

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

Si noti che questo implica una query di database per record, ma è un “upsert”, quindi non è necessario verificare se esiste già un record. Nel tuo esempio, questo non è un problema, ma nella maggior parte delle applicazioni diventa uno alla fine.

Il modo più semplice senza gem aggiuntivo è concatenare una stringa ed eseguirla in un unico inserimento 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) 

Ho appena scritto una piccola patch di scimmia per Active Record 3.2 per INSERISCI molti nuovi record con una singola query SQL, dai un’occhiata:

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