我想在rails中一次添加多条记录。
tax_rates.map {|tax_rate| TaxRate.new(tax_rate).save }
但在这方面,有些记录可能会被保存,而有些记录会被拒绝。
如果某些记录失败,有人可以解释我如何拒绝所有记录吗?
提前致谢。
答案 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
编辑:添加代码,以证明它不会在数据库上静默提交任何内容。