我有内容管理系统应用程序,它使用多态树表作为其安排的核心。我遇到了一个问题,一旦树长得很大,并且因为我们有相当多的不同模块(大约25个),只需要做:include => :实例不切芥末。实例是我们的多态关系的名称。
有趣的是,在大多数情况下,当我想要这些项目的大型列表时,我真正想要的只是来自关联表格的名称(例如,出于索引栏的目的),其余所有内容都在中央表。所以我认为我应该为中心表中的名称实现某种列缓存。 (就像rails已经做的计数器缓存一样)。
我只是想知道是否存在管理此插件的插件?
如果没有,我只是要在中心表中添加一个'name'列,因为所有的多态模型都继承了一个超类,只需添加一个回调,只要创建项目,该回调就会将名称推送到中心表或更新。然后我会做一个大的迁移,首先填充它?
该设计有任何缺陷吗?
我想要更灵活一点,列可以是某种序列化缓存,如果需要,我可以在以后存储其他东西?尔加! :d
答案 0 :(得分:0)
回答我自己的问题,我在中央表上添加了一个'cached_name'列,创建了'rebuild_cached_name!'刚刚遍历每条记录并将缓存的名称设置为正确值的方法。我从创建缓存列的迁移中调用了rebuild方法。
然后我在我的抽象类(多态继承的类)上修改了after_create方法,并使其在中央表中分配了cached_name。我还添加了一个after_update方法调用,只要更改了普通名称,就会更新cached_name。
非常简单,但现在它意味着不再需要在简单的情况下调用多态,例如生成索引栏。