有一个用于创建ApplicationRecord
个对象的哈希数组。
a = [{name: 'foo', title: 'bar'},
{name: 'foo2', title: 'bar2'}]
我可以通过Foo.create(a)
创建多个对象,我可以使用rescue
子句来捕获唯一约束异常。
但我无法一次找出如何创建多个对象而忽略异常。
我只能通过循环来编写它。
a.each do |hash|
begin
Foo.create(hash)
rescue
next
end
end
或
a.each do |hash|
Foo.find_or_created_by(name: hash[:name], title: hash[:title])
end
如何在这种情况下一次创建对象?
答案 0 :(得分:0)
试试这个
begin
ActiveRecord::Base.transaction do
a.each{|hash| Foo.create(hash) }
end
#handle success here
rescue ActiveRecord::RecordInvalid => exception
#handle failure here
end
异常似乎是
#<ActiveRecord::RecordInvalid: Validation failed: Title can't be blank>
和 exception.message
# => "Validation failed: Email can't be blank"
希望这可以提供帮助。 :)
答案 1 :(得分:0)
出了什么问题:
# not Foo.create!(a)
Foo.create(a)
?,它可以将哈希数组作为参数,并保存通过验证的那些,忽略那些不是。
顺便说一句,我不认为
Foo.create(hash)
会引发任何验证异常,因为它不是'!'版本(如:Foo.create!(hash))。如果来自数据库的唯一约束异常,而不是验证,则需要对其进行验证。