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