Как вставить несколько записей в базу данных
Как вставить несколько записей в базу данных с помощью синтаксиса рельсов.
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"}])