保存活动记录数组

Luc*_*oli 18 ruby ruby-on-rails

我有这样的数组

a = []

a << B.new(:name => "c")
a << B.new(:name => "s")
a << B.new(:name => "e")
a << B.new(:name => "t")
Run Code Online (Sandbox Code Playgroud)

我怎么能立刻保存它?

Ben*_*nns 48

B.transaction do
  a.each(&:save!)
end
Run Code Online (Sandbox Code Playgroud)

这将创建一个循环遍历数组的每个元素并在其上调用element.save的事务.

您可以阅读有关ActiveRecord事务以及Rails和Ruby API中的每个方法的信息.


Jor*_*ing 28

a.each(&:save)
Run Code Online (Sandbox Code Playgroud)

这将调用B#save数组中的每个项目.

  • 并将其包装在B.transaction中以将其全部保存在一个原子操作中. (10认同)
  • 永远不要只调用`save`,要么检查返回值(true或者为false),要么使用`.save!`让rails在异常不正常时引发异常! (6认同)

小智 11

所以我认为我们需要一个中间立场,让Alexey提高例外并中止交易和Jordan的单线解决方案.我可以建议:

B.transaction do
  success = a.map(&:save)
  unless success.all?
    errored = a.select{|b| !b.errors.blank?}
    # do something with the errored values
    raise ActiveRecord::Rollback
  end
end
Run Code Online (Sandbox Code Playgroud)

这将为您提供两个方面:具有回滚的事务,知道哪些记录失败,甚至可以让您访问其中的验证错误.

  • 而不是`!b.errors.blank?`,为什么不``b.errors.present?` (2认同)