save an active records array

前端 未结 6 801
梦如初夏
梦如初夏 2021-02-05 07:28

I have an array like this

a = []

a << B.new(:name => \"c\")
a << B.new(:name => \"s\")
a << B.new(:name => \"e\")
a << B.new(:n         


        
6条回答
  •  走了就别回头了
    2021-02-05 08:23

    Wrapping save in transaction will not be enough: if a validation is not passed, there will be no exception raised and no rollback triggered.

    I can suggest this:

    B.transaction do
      a.each do |o|
        raise ActiveRecord::Rollback unless o.save
      end
    end
    

    Just doing B.transaction do a.each(&:save!) end is not an option either, because the transaction block will not rescue any exception other than ActiveRecord::Rollback, and the application would crash on failed validation.

    I do not know how to check afterwards if the records have been saved.


    Update. As someone has downrated my answer, i assume that the person was looking for a cut-and-paste solution :), so here is some (ugly :)) way to process fail/success value:

    save_failed = nil
    B.transaction do
      a.each do |o|
        unless o.save
          save_failed = true
          raise ActiveRecord::Rollback
        end
      end
    end
    if save_failed
      # ...
    else
      # ...
    end
    

提交回复
热议问题