我正在处理这个要求:我有一个很大的对象关系模型,其中实体之间的联系非常紧密。让我们以这种关系为例:一栋建筑有很多公寓,一个公寓有很多分区。现在,我想要的是:当任何部门发生变化时,我想“通知”建筑物,或者更好地标记建筑物已被“更新”或“修改”。
当前解决方案:我们有一个自己编写的实现,我们将在其中将分区标记为“影响”建筑物,并且每次更新分区时都会更新建筑物的“修改”时间戳。
期望的解决方案:一个已经存在的“开箱即用”的实现(一个gem,一个插件,也许是上帝),这将使我们免于重构我们的实现的工作。
不需要的解决方案:请不要告诉我用 :autosave => true 标记所有这些关联。我想要一个可排队的解决方案。
当然,也欢迎不包含所需解决方案但建议改进当前解决方案性能的解决方案。在缺乏理想的解决方案的情况下,我们肯定会改进现有的解决方案。
一个小编辑:
这种行为必须是通用的。它不仅适用于建筑案例,任何具有关联的模型都可以具有这种行为。这将始终是相同的:获取受影响的关联并更新它们。现在,我不想用相同的例程编写不同的观察者。
关于性能问题:更新受影响的关联更新也必须触发其受影响的关联。现在,让我们假设 1 个建筑物影响 100 个分区,每个分区影响 100 个椅子。现在,观察者解决方案仅适用于业务级别。也就是说,我必须实例化每个 AR 实例,以便观察者可以采取行动。我认为这是糟糕的表现。如果 A 影响 100 个 B,我用一个 DB 语句来做。但是,当我使用 SQL 完成所有操作时,如何触发这 100 个观察者呢?
所以,回到主要的更新点:这种行为是通用的,最重要的是,性能必须是顶级的(例如,关联可能会触发 has_many 关联的 nxn 更新)。