在我的应用程序中,我想在登录时提供类似屏幕的仪表板,以便了解正在发生的事情。我有大约4个模型需要从中收集数据并按顺序对它们进行排序。我的问题是知道 操作,因此我可以获得每个模型的特定字段。
以下是关于如何实现这一目标的一些想法,但我觉得它们不是最好的和不完整的。
我有一个单独的模型,其中包含:model,associated_id,action。 “Post,1,created”就是一个例子。
拥有4个不同的数组,并通过说created_at
将它们与正确的顺序合并。
最好的方法是什么?我在下面提供了一个例子:
答案 0 :(得分:8)
您可能想查看rails的timeline_fu插件:
答案 1 :(得分:3)
使用单独的模型存储您在第一个想法中建议的Feed条目。您所看到的设计模式称为polymorphic association pattern
我们假设这个新模型被称为Feed,遵循多态关联模式,您将使用列:feedable_type和feedable_id(与建议的列名称模型和associated_id相对应)
我必须承认,您的问题比对多态关联的简单理解更大,Feed是现代信息设计的一项重大创新,需要许多复杂功能,包括:
根据这些属性中的任何一个,所有这些都会变得非常复杂。如果你必须满足一些非功能性要求,比如缩放和性能,那么头痛很快就会复杂化。
如果你曾经构建过一个Facebook应用程序,那么了解他们的feed发布API是如何工作的,这是非常有启发性的。
您很快就会注意到,用于存储Feed的单独模型完全没有装备来呈现Feed条目HTML,但是加载用于呈现HTML的原始模型是数据库非常昂贵的。为了解决这个问题,我让原始模型渲染了feed的HTML,并将其存储到feed表中。
当然,实施甚至比这更复杂。与Facebook一样,所有Feed都有1个共同点(它们来自人)。所以每个feed条目都有user_id(可以这么说)。由于我们知道所有Feed都有这些数据,并且可以呈现新闻Feed的“谁做了”部分,因此我们不预先渲染该部分。
尽可能多地预渲染以后很难从Feed模型重新构建,但是当我们确定组件无处不在并且隐藏在我们的Feed模型中时,会延迟预渲染。 / p>
最后,研究开源项目是一种很好的学习方式