2017-05-02 6 views
2

クラスP(親)とC(子)の間に1対多の関係があります。Rails 5.例外処理との関連付けの更新

Cは、ユニークな複合インデックス{p_id, somerow}を持っています。クラスPp1p2)の2つのオブジェクトを持つ

は、私が p2.childs.update_all (parent: p1)を介してこれをやって、一つにそれらを結合したいのですが、複合インデックスの一意性に違反しているので、私は、トランザクションのロールバックを取得します。しかし、内部ロジックの観点からは、この状況はエラーではなく、親を変更する代わりに重複したエントリを破棄する必要があります。

問題を解決する最も正しい方法は何ですか?

P.S.データベースへの要求の数は非常に重要です。

P.P.S.関係の子供の数は1kレコードの値を超えることができます。

+0

あなたは 'P1 = P1&p2'をしたいですか? 'p1.childs = p1.childs&p2.childs'ですか? '&'は "combined"を意味します。その後、 'p2.destroy'が必要ですか? 'p2.childs.destroy_all'もしたいですか? –

+0

正確に。私は合併したい。 'p1'に重複が存在しないすべての' p2'子が追加されなければならず、重複は削除されなければなりません。 – 0xDEADBEEF

+0

'p2.children'のいくつかが削除されるかどうかをどうやって判断しますか? 'somerow'に既に重複があるのでしょうか? –

答えて

0

あなたは、各レコードを検証するために、別のクエリを実行を意味し、Railsのことでレコードを検証する準備ができている場合は、ここでそれを行うための簡単な方法は次のとおりです。

class C < ActiveRecord::Base 
    validates_uniqueness_of :somerow, scope: :p_id 

    belongs_to :p 
end 

class P < ActiveRecord::Base 
    has_many :childs 

    def merge_sibling(p2) 
    p2.childs.each do |c| 
     c.p_id = self.id 
     c.valid? ? c.save : c.destroy 
    end 
    p2.destroy 
    end 
end 

p1.merge_sibling p2 
関連する問題