在rails中保存多个记录,如果某些记录失败则撤消

时间:2017-11-27 06:30:49

标签: ruby-on-rails

我想在rails中一次添加多条记录。

tax_rates.map {|tax_rate| TaxRate.new(tax_rate).save }

但在这方面,有些记录可能会被保存,而有些记录会被拒绝。

如果某些记录失败,有人可以解释我如何拒绝所有记录吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

我会做这样的事情:

TaxRate.transaction do
  tax_rates.map do |tax_rate| 
    raise ActiveRecord::Rollback unless TaxRate.new(tax_rate).save
  end
end

或者出于可读性原因,您可能希望为模型添加新方法:

# in models/tax_rate.rb
def self.create_all(rates)
  transaction do
    rates.map do |rate| 
      raise ActiveRecord::Rollback unless TaxRate.new(rate).save
    end
  end
end

并在你的控制器中使用它:

TaxRate.create_all(tax_rates)

答案 1 :(得分:2)

使用交易。

ActiveRecord::Base.transaction do
  model1.create!
  model2.create!
  model3.create!
  anything that triggers an exception
  or raise ActiveRecord::Rollback
end

[1] pry(main)> ActiveRecord::Base.transaction do [1] pry(main)* User.create(email: "asfsdaf@spuul.com", password: "asdkfasdlfk") [1] pry(main)* Network.create(user_id: 1) [1] pry(main)* end
(22.9ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 (6.4ms) BEGIN User Exists (24.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'asfsdaf@spuul.com' LIMIT 1 (0.2ms) ROLLBACK ActiveModel::UnknownAttributeError: unknown attribute 'user_id' for Network.

事务通过回滚重置记录状态。在Rails中,回滚仅由异常触发。 因此,请确保您使用的方法触发一个。某些AR方法不会触发失败例外,例如update_attribute

有关此内容的更多信息: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

编辑:添加代码,以证明它不会在数据库上静默提交任何内容。