2

我有一些模型都在内存中链接在一起(父:子:子:子),并通过保存最顶层的父级同时保存。这工作正常。

我想利用其中一个孩子的 after_create 回调来填充变更日志表。我需要复制/推送到更改日志表中的属性之一是孩子的 foreign_key 到它的直接父级,但它在 after_create 触发时不存在!?!

如果没有 after_create 回调,我可以查看日志并查看子项在其父项(外键空白)之前被保存,然后插入父项......然后使用父项的 id更新子项。孩子的 after_create 在正确的时间触发,但它发生在 Rails 有机会使用 foreign_key 更新孩子之前。

有什么方法可以强制 Rails 以某种顺序保存这样的模型链接?即父母,然后是孩子(父母foreign_key存在),然后是孩子的孩子(同样,foreign_key是可访问的)等等。??如果没有,在创建记录并获取foreign_key 后,我将如何进行常规触发?

似乎这样的回调会有所帮助:after_create_with_foreign_keys

4

2 回答 2

2

由于我在内存中构建所有关联模型并在保存最顶层父级时依靠 Rails 保存所有内容,因此我无法利用 after_create 回调并使用外键(用于 change_log 表条目),因为Rails 保存模型的顺序。一切总是以正确的方式连接,但有时会首先保存子记录,然后是父记录,然后会更新子记录以插入 parent_id。

我的解决方案是不在内存中构建我的模型,放弃一举保存所有内容的想法。相反,我会保存最顶层的模型,然后通过该父级的 after_create 创建它的子级。那个孩子的 after_create 然后会创建它的孩子,依此类推。我更喜欢这种安排,因为我可以更好地控制与外键相关的回调。最后,整个事情被包装在一个数据库事务中,以便在出现严重错误时撤消任何插入。这是我在内存中构建所有内容的最初原因,所以在保存之前我会把所有的鸭子排成一排。模型/数据库事务减轻了担忧。

于 2010-05-02T21:51:55.027 回答
0

在 parent_id 可用后,您可以用after_update来抓孩子吗?触发时after_update, parent_id 将可用,因此如果孩子不在表中,则插入它。

于 2010-03-12T17:47:34.773 回答