2

我有一些模型全部在內存中鏈接在一起(父:孩子:孩子:孩子),並通過保存最頂級的父母同時保存。這工作正常。在after_create回調期間無法獲取外鍵,因爲它尚不存在!

我想挖掘其中一個子項的after_create回調來填充更新日誌表。我需要複製/推入更改日誌表的屬性之一是子節點的foreign_key,它是直接父節點,但在after_create觸發時不存在!!!

如果沒有after_create回調,我可以在日誌中查看並看到孩子正在被保存之前,它的父母(外鍵空白),然後父母被插入...那麼孩子是已更新 ID父母。孩子的after_create在正確的時間開槍,但是在Rails有機會用foreign_key更新孩子之前就發生了。

有什麼辦法可以強制Rails以某種順序保存模型的鏈接嗎? ie.parent,那麼child(父foreign_key存在),那麼這個孩子的孩子(再次,foreign_key是可訪問的)等?如果沒有,創建記錄後如何進行常規掃描,並獲取foreign_key?

似乎這樣的回調將是有益的:after_create_with_foreign_keys

回答

2

由於我在內存中構建了所有關聯的模型,並且在保存最頂層父項時依靠Rails保存所有內容,因此無法使用after_create回調函數並使用外鍵(對於change_log表項),因爲Rails會保存模型的順序。一切都以正確的方式結束,但有時先保存子記錄,然後保存父項,然後更新子記錄以插入parent_id。

我的解決方案是不建立我的記憶模型,放棄了一舉拯救一切的想法。相反,我會保存最頂級的模型,然後通過父級的after_create創建子級。那孩子的創建後會創建自己的孩子,等等。我更喜歡這種安排,因爲我可以更好地控制與外鍵相關的回調。最後,整個事情被包裝在一個數據庫事務中,以便在路上出現可怕的錯誤時撤銷任何插入。這是我在記憶中建立一切事物的原始理由,所以在儲存之前我會把所有的鴨子都放在一起。模型/分貝交易緩解了擔憂。

0

你能使用after_update趕上孩子PARENT_ID可用之後?當after_update觸發時,parent_id將可用,所以如果孩子不在表中,請插入它。

相關問題