Как вставить несколько записей в базу данных - PullRequest
11 голосов
/ 27 апреля 2011

Как я могу вставить несколько записей в базу данных, используя синтаксис rails.

INSERT INTO users (email,name) VALUES ('a@ao.in','a'),('b@ao.in','b'),
                                      ('c@ao.in','c');

Вот как мы это делаем в MySQL. Как это делается в Rails?

Ответы [ 7 ]

14 голосов
/ 27 апреля 2011

Проверьте это сообщение в блоге: 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

В зависимости от вашей версии rails используйте activerecord-import 0.2.6 (для Rails 3) и ar-extensions 0.9.4 (для Rails 2)

От автора: http://www.continuousthinking.com/tags/arext

12 голосов
/ 27 апреля 2011

Хотя вы не можете получить точный SQL, который у вас есть, вы можете вставить несколько записей, передавая create или new в массив хэшей:

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

MyModel.create(new_records)
10 голосов
/ 27 апреля 2011

Я использую следующее в моем проекте, но это не подходит для SQL инъекций. если вы не используете пользовательский ввод в этом запросе, он может работать для вас

user_string = " ('a@ao.in','a'), ('b@ao.in','b')"
User.connection.insert("INSERT INTO users (email, name) VALUES"+user_string) 
4 голосов
/ 28 декабря 2012

Просто используйте gem activerecord-import для рельсов 3 или ar-extensions для рельсов 2

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

В Gemfile:

gem "activerecord-import"

В модели:

import "activerecord-import"

В контроллере:

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

Этот код импортирует 10 записей одним запросом;)

или

#@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
0 голосов
/ 07 августа 2012

Вы можете использовать Fast Seeder для многократной вставки.

0 голосов
/ 27 марта 2012

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
0 голосов
/ 27 апреля 2011

Просто передайте массив хэшей методу create следующим образом:

User.create([{:email => "foo@com", :name => "foo"}, {:email => "bar@com", :name => "bar"}])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...