2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

railsで複数モデルを保存するとき

Last updated at Posted at 2019-11-18

Railsで複数モデルを同時に保存する必要がある際、トランザクション内で

ActiveRecord::Base.transaction do
  保存成功時の処理 if models.all?(&:save)
  raise "error"
end

みたいに書きたいことがあったが、all?はある要素のsaveがfalseを返した場合、それ以降の要素についてsaveメソッドを実行しない。saveメソッドの実行によりエラーメッセージを取得したいような場合、全ての要素について実行してもらう必要がある。今回は以下のように書いた。

ActiveRecord::Base.transaction do
  保存成功時の処理 if models.inject(true){|result, elem| result && elem.save }
  raise "error"
end

もっと良い書き方があれば是非ご指摘ください。

2019/11/20 追記
@betrue12さんからmodels.map(&:save).all?で良いのでは?とご指摘いただいて、確かにその通りでしたので追記させていただきます。下記のように書き直しました。

ActiveRecord::Base.transaction do
  保存成功時の処理 if models.map(&:save).all?
  raise "error"
end
2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?