2017-01-12 7 views
0

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

は:?

# not Foo.create!(a) 
Foo.create(a) 

、それができたのparamsとしてハッシュの配列を受け取り、そしてものが検証に合格し保存し、ものがdoes't無視します。ところで

は、私が

Foo.create(hash) 

は、任意の検証例外を発生させ、それ以降はないだろうと思ういけません「!」バージョン(Foo.create!(ハッシュ)のように)。そして、妥当性検査ではなく、データベースからのユニークな制約の例外の場合は、それを検証する必要があります。

0

例外が

#<ActiveRecord::RecordInvalid: Validation failed: Title can't be blank> 

そして exception.message

# => "Validation failed: Email can't be blank" 

のように見えるこの

begin 
    ActiveRecord::Base.transaction do 
    a.each{|hash| Foo.create(hash) } 
    end 
    #handle success here 
rescue ActiveRecord::RecordInvalid => exception 
    #handle failure here 
end 

を試してみてはこれが役立つことを願って。 :)と間違って何

関連する問題