Techioz Blog

deep_cloneable gem (関連付けのあるアクティブレコードのクローン作成)

概要

クラス A のオブジェクトを、その (複製された) B、C、D のすべての関連付けとともに複製できるようにしたいと考えています。

私は持っている クラスA、B、C、D:

A には B が多数あります

A には C が多数あります

A には D から B までが多数あります

B は A に属します

B には D が多数あります

CはAに属します

C には D が多数あります

DはBに属します

D は C に属します

したがって、たとえばクラス D の各オブジェクトには属性 b_id と c_id があります。

クラス A のオブジェクトを、その (複製された) B、C、D のすべての関連付けとともに複製できるようにしたいと考えています。

deep_cloneable のドキュメントに従って、私が入手できる最も近いものは次のとおりです。

A.first.deep_clone include: [ {bs: :ds}, :cs ].save

これにより、 A オブジェクトの複製と、その B および C 関連付けの複製 (必要に応じて)。 B に属する D も複製され、新しく複製された B に関連付けられますが、新しく複製された C ではなく、元の C に関連付けられたままになります。

同様に

A.first.deep_clone include: [ {bs: :ds}, { cs: :ds} ].save 

追加の D セットが複製されます (1 つのセットは新しい B に関連付けられますが新しい C には関連付けられず、もう 1 つのセットは新しい C に関連付けられますが新しい C には関連付けられません)。

deep_cloneable gem を使用して、必要なことを直接実現できますか?

解決策

(A.first.deep_clone include: [ {bs: :ds}, { cs: :ds} ], use_dictionary: true).save

これにより、必要な重複が作成されます。構文はドキュメントの「The Dictionary」に記載されていますが、その説明や「辞書」の用語が理解しやすいとは言えません。