私は一つだけレベルの深い団体と、前に似た何かをやりました。例えば。あなたは、関連する他のモデルのあなたの団体はかなり単純であることを確認しなければならない一または-多くのアドレス、連絡先、など。
を持っていたアカウントなので、そこにはループがありませんまたはバックポインタ
にですモデルの現在のバージョンと後で比較するのが簡単な方法で保存することをお勧めします。
モデルの最初の保存時に、モデルのクローンを作成して関連付けを行い、シリアライズされたフィールドに保存しますメインモデルでは「オリジナル」です。
私は例えば、私はActiveRecordののserialize
機能を使用したいと思います。:
Class YourMainModel
...
serialize :original # will serialize this ; make this TEXT field in DB
...
end
あなたは、データベース内のフィールドのデータ型がテキストまたは文字列ではなく、バイナリフィールドであることを確認するには! (それは後にバグを引き起こす!)そして、
をモデルのafter_saveの間に、私はこのような何かを行うにはいくつかのコードを追加します。
# do this in the after_save - so the validations have run:
main_model_object.original ||= main_model_object.deep_clone # ||= to do this only once
main_model_object.save(:validate => false) if main_model_object.original_changed? # save if we added the "copy"
これをフックするために、おそらく他の方法がありますが、after_saveあり検証が実行される利点。
最初に保存した時点までに関連するすべてのレコードが作成されていることを確認する必要があります。おそらく、nested_forms Gemを使用して「モンスターフォーム」を実行することをお勧めします。
参照:
https://github.com/moiristo/deep_cloneable(Railsのためのフォーク3)
https://github.com/openminds/deep_cloning(元のプロジェクト)
チェックアウト他のライアンのRailsCasts:
http://railscasts.com/episodes/196-nested-model-form-part-1
http://railscasts.com/episodes/197-nested-model-form-part-2
これは
EDIT役立ちます
希望:データベース/データベースのサイズを制限するために、第二思想に
があなたのスキーマを簡単にするために、ダンプ、とにオリジナルを安全に保つ、あなたが望むかもしれませんオリジナルを別のドキュメントストアに保存するそのためにMongoDBを使うことができます。
オリジナルに頻繁にアクセスする必要がない場合は、構造化文書としてMongoDBに格納することは本当に有益であり、メインアプリケーションの複雑さを軽減します。
レコードを比較すると、最初に行ったのと同じ方法で修正したモデルをdeep_cloneし、元のレコードの 'id'フィールドでMongoDBレコードを検索してから2つを比較しますクローン)。
このソリューションの利点:SQLデータベースレコードに直接添付されていないため、誤って元のデータを変更するのが難しくなります。例えばあなたは偶然にすることができなかったobject.original = something
なぜすべてのリレーションシップをコピーしたいですか? – Tilo