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