开发者

How to insert multiple records into database

How can I insert multiple records into a database using rails syntax.

INSERT INTO users (email,name) VALUES ('a@ao.in','a'),('b@ao.in','b'),
                    开发者_如何学JAVA                  ('c@ao.in','c');

This is how we do it in MySQL. How is this done in Rails?


Check out this blog post: http://www.igvita.com/2007/07/11/efficient-updates-data-import-in-rails/

widgets = [ Widget.new(:title => 'gizmo', :price => 5),
            Widget.new(:title => 'super-gizmo', :price => 10)]
Widget.import widgets

Depending on your version of rails, use activerecord-import 0.2.6 (for Rails 3) and ar-extensions 0.9.4 (for Rails 2)

From the author: http://www.continuousthinking.com/tags/arext


While you cannot get the exact SQL that you have there, you can insert multiple records by passing create or new on an array of hashes:

new_records = [
  {:column => 'value', :column2 => 'value'}, 
  {:column => 'value', :column2 => 'value'}
]

MyModel.create(new_records)


I use following in my project but it is not proper for sql injection. if you are not using user input in this query it may work for you

user_string = " ('a@ao.in','a'), ('b@ao.in','b')"
User.connection.insert("INSERT INTO users (email, name) VALUES"+user_string) 


Just a use activerecord-import gem for rails 3 or ar-extensions for rails 2

https://github.com/zdennis/activerecord-import/wiki

In Gemfile:

gem "activerecord-import"

In model:

import "activerecord-import"

In controller:

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

This code import 10 records by one query ;)

or

#@messages = ActiveSupport::JSON.decode(@content)
@messages = JSON(@content)

#prepare data for insert by one insert
fields = [:field1, :field2]
items = []
@messages.each do |m|
    items << [m["field1"], m["field2"]]
end

Message.import fields, items


You can use Fast Seeder to do multiple insert.


In People_controller.rb

# POST people

NAMES = ["Sokly","Nary","Mealea"]

def create
    Person.transaction do
        NAMES.each do |name|
            @name = Person.create(:name => name)
            @name.save
        end
    end 
end


Just pass an array of hashs to the create method like this:

User.create([{:email => "foo@com", :name => "foo"}, {:email => "bar@com", :name => "bar"}])
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜