それはまだ存在しないためafter_create、コールバック時に外部キーをつかむことはできません!

StackOverflow https://stackoverflow.com/questions/2390828

質問

私はいくつかのモデルは、すべてのメモリに一緒にリンクされている(親:子:子供:子供)と最上位の親を保存することで、同時に保存します。これは、罰金に動作します。

私は、変更履歴テーブルを移入する子の1つのafter_createコールバックを活用したいと思います。私はコピーする/プッシュを変更履歴テーブルに必要な属性の一つは、それまでの子供のFOREIGN_KEYは、直接の親だが、それは時間after_create火災に存在していないです!?!

after_createコールバックがなければ、私はログに見て、子供がそれの親(外部キー空白)前に保存されていることがわかりますが、親が挿入されて...その後子供は、の更新のです親からのIDを持ちます。子供のafter_createは、適切なタイミングで発射されていますが、RailsはFOREIGN_KEYで子供を更新する機会があった前にそれが起こっています。

Railsは、特定の順序でのモデルのようにリンケージを保存するために強制する方法はありますか? ie.parent、その後、子(親FOREIGN_KEYが存在する)、その後、子の子ということなど(再び、FOREIGN_KEYはアクセス可能です)??ない場合は、レコードが作成され、FOREIGN_KEYを取得する?された後、どのように私は私の日常の火を持っているでしょう。

は、このようなコールバックが参考になるようだ:after_create_with_foreign_keys

役に立ちましたか?

解決

私は、メモリ内のすべての私の関連するモデルを構築し、私は最上位の親を保存すると、すべてを保存するためのRailsに頼っていたので、私はafter_createコールバックにタップして、(change_logテーブルエントリ用)外部キーを使用することができませんでしたRailsはモデルを救うれる順序のため。すべては、常に適切な方法で接続されて終わったが、時には子レコードは、親が、その後、PARENT_IDを挿入する子レコードへの更新が起こるのか、最初に保存されます。

私のソリューションを一挙にすべてを保存するという考えを捨て、メモリ内の私のモデルを構築していないことでした。代わりに、私は最上位のモデルを保存し、その親のafter_createを経由して、その子を作成します。あの子のafter_createは、その子などを作成します。 Iこの構成のようにはるかに良い私は外部キーとの関係で私のコールバックをより詳細に制御を持っているよう。任意の挿入を元に戻すように何かが道に沿って恐ろしく間違っていた場合は最後に、全体のことは、DBトランザクションに包まれました。私は保存する前に、行のすべての私のアヒルを持っていると思いますので、これは、メモリ内のすべてを構築するための私の元の理由でした。モデル/ DBトランザクションの心配を軽減します。

他のヒント

あなたはPARENT_IDが利用可能になった後、子供をキャッチするためにafter_updateを使用してもらえますか?ときafter_update火災、PARENT_IDは、子供がテーブルにない場合ので、それを挿入し、利用できるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top