11 votes

Comment insérer plusieurs enregistrements dans une base de données ?

Comment puis-je insérer plusieurs enregistrements dans une base de données en utilisant la syntaxe des rails.

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

Voici comment nous procédons dans MySQL. Comment cela se passe-t-il dans Rails ?

14voto

Jesse Wolgamott Points 30552

Consultez cet article de blog : 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

Selon votre version de rails, utilisez activerecord-import 0.2.6 (pour Rails 3) et ar-extensions 0.9.4 (pour Rails 2).

De l'auteur : http://www.continuousthinking.com/tags/arext

12voto

Beerlington Points 25012

Bien que vous ne puissiez pas obtenir le code SQL exact que vous avez là, vous pouvez insérer plusieurs enregistrements en passant create ou new sur un tableau de hachages :

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

MyModel.create(new_records)

10voto

Salil Points 20300

J'utilise ce qui suit dans mon projet mais ce n'est pas correct pour l'injection sql. Si vous n'utilisez pas d'entrée utilisateur dans cette requête, cela peut fonctionner pour vous.

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

4voto

snakemw Points 41

Il suffit d'utiliser la gemme activerecord-import pour rails 3 ou ar-extensions pour rails 2.

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

Dans Gemfile :

gem "activerecord-import"

Dans le modèle :

import "activerecord-import"

Dans le contrôleur :

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

Ce code permet d'importer 10 enregistrements en une seule requête ;)

o

#@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

0voto

hengsokly Points 106

Dans 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X