2016-06-23 15 views
0

親DBモデルのテーブルにbulk insertペアの親子モデルを作成しようとしていますが、標準のActiveRecord機能ではできません。私も生のSQLでそれを達成しようとしたが、私はへの道を見つけることができませんでしませんでした だから、私は、ActiveRecordのインポート宝石を試してみましたが、それはどちらかのMySQLのための再帰的な挿入をサポートしていません...同時に親子の一括挿入

# Book has_many authors/Author belongs to Book 
books = [] 
10000.times do |i| 
    book = Book.new(:name => "book #{i}") 
    book.author.build(:name => "author #{i}") 
    books << book 
end 
Book.import books, recursive: true # THIS DOES NOT WORK 

子データを挿入したいときにその親がまだそのIDを持っていないので、各親/子の参照を保持します。
誰もがこの問題を解決する方法を知っていますか?

+0

あなたは一括挿入で何をしていますか?あなたは、このデータベースにすべてのデータを1回挿入するか、挿入自体を処理するためにデータベースを作成する必要があります。 – lcguida

+0

私はただ1つのINSERT文を作成したいと思います。 INSERT INTO *** VALUES(***)、(***)、......(10000回)のようなもの – sora

答えて

0

、このようにしてみてください:

books = [] 
10000.times do |i| 
    book.name = "book #{i}") 
    books << book 
end 
Book.import books // Here it creates Books 

私はあなたが著者を作成することがさらに進むことができますかわからない...

0

を使用すると、ネストされた属性ブックモデル

を使用する必要があります

accepts_nested_attributes_for :author 

あなたは次の方法でそれを行うことができます

books = [] 
10_000.times do |i| 
    books << { name: "book #{i}", author_attributes: { name: "author_#{i}" } 
end 

Book.create(books) # it will create all object in single transaction 
+0

ありがとうございました。あなたはそれが単一のトランザクションだと言ったが、私の理解ではINSERT文を10000回作成する。 (私が間違っていると教えてください)私は '一括挿入'の意味は、VALUESの束と1つのINSERTステートメントでそれを達成することです。 – sora