Как вставить несколько записей в базу данных

Как вставить несколько записей в базу данных с помощью синтаксиса рельсов.

INSERT INTO users (email,name) VALUES ('[email protected]','a'),('[email protected]','b'),
                                      ('[email protected]','c');

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

Ответ 1

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

user_string = " ('[email protected]','a'), ('[email protected]','b')"
User.connection.insert("INSERT INTO users (email, name) VALUES"+user_string) 

Ответ 2

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

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

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

Ответ 3

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

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

MyModel.create(new_records)

Ответ 4

Просто используйте activerecord-import gem для рельсов 3 или ar-расширений для рельсов 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

Ответ 5

В 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

Ответ 6

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

Ответ 7

Просто передайте массив хэшей методу create, подобным этому:

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