1. ホーム
  2. ruby-on-rails

[解決済み] railsで1回の呼び出しで複数のオブジェクトを保存する

2022-02-19 06:59:06

質問

railsで以下のようなメソッドがあります。

a = Foo.new("bar")
a.save

b = Foo.new("baz")
b.save

...
x = Foo.new("123", :parent_id => a.id)
x.save

...
z = Foo.new("zxy", :parent_id => b.id)
z.save

問題は、エンティティを追加すればするほど、この作業に時間がかかることです。これは、すべてのレコードについてデータベースをヒットしなければならないからだと思います。ネストされているので、親を保存する前に子を保存することはできませんが、一度にすべての親を保存し、その後すべての子を保存したいと思います。次のようなことができればいいのですが。

a = Foo.new("bar")
b = Foo.new("baz")
...
saveall(a,b,...)

x = Foo.new("123", :parent_id => a.id)
...
z = Foo.new("zxy", :parent_id => b.id)
saveall(x,...,z)

そうすれば、たった2回のデータベースヒットですべてが完了します。railsでこれを行う簡単な方法はありますか、それとも一度に1つずつ行うことになるのでしょうか?

どのように解決するのですか?

insert_all (Rails 6+)

Rails 6 は、新しいメソッドを導入しました。 インサート_オール これは、複数のレコードを一度にデータベースに挿入するものです。 SQL INSERT ステートメントを使用します。

また、このメソッド はいかなるモデルもインスタンス化しません。 Active Recordのコールバックやバリデーションを呼び出さない .

だから

Foo.insert_all([
  { first_name: 'Jamie' },
  { first_name: 'Jeremy' }
])

よりも大幅に効率的です。

Foo.create([
  { first_name: 'Jamie' },
  { first_name: 'Jeremy' }
])

新しいレコードを挿入したいだけなら