如何一次创建多个对象并忽略唯一约束异常

时间:2017-01-12 03:11:13

标签: ruby-on-rails

有一个用于创建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

如何在这种情况下一次创建对象?

2 个答案:

答案 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))。如果来自数据库的唯一约束异常,而不是验证,则需要对其进行验证。