[英]How to implement bulk insert in Rails 3
我需要將一組電子郵件作為不同的記錄插入到我的聯系人表中。 如何才能做到這一點。
Eg: @email = ["a@b.com", "c@d.com", "e@f.com", ... ]
我不想用。
@email.each do |email|
@contact = Contact.new
@contact.email = email
@contact.save
end
這導致n插入quires。 我只需要一個插入查詢來插入這些值。 如何在rails 3.0.9(以及理想的MySQL)中完成。 請幫忙
您也可以嘗試upsert
,這幾乎和activerecord-import
一樣快,但只適用於(當前)MySQL,Postgres和SQLite3:
require 'upsert'
Upsert.batch(Contact.connection, Contact.table_name) do |upsert|
emails.each do |email|
upsert.row(email: email)
end
end
請注意,這涉及每個記錄一個數據庫查詢,但它是一個“upsert”,因此您不必檢查記錄是否已存在。 在您的示例中,這不是一個問題,但在大多數應用程序中,它最終成為一個問題。
沒有額外gem的最簡單方法是連接一個字符串並在一次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)
我剛剛為Active Record 3.2寫了一個小小的補丁,用一個SQL查詢插入許多新記錄,檢查出來:
https://github.com/alexdowad/showcase/blob/master/activerecord/bulk_db_operations.rb
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.