我有Projelements
,它们类似于:
Milestone
Task
- 。。。等等
每个Projelement
可以具有一个或多个嵌入的Comments
(得益于Mongoid
)。
我想能够很容易地说:
给我一个Projelements
的列表,按它们上次更新的时间排序
其中Projelement
的last_updated
是中的较大者
this_projelement.updated_at
或if this_projelement.comments.count > 0 then this_projelement.comments.last.updated_at
我可以用上面的逻辑创建一个Projelement
类方法last_updated_at
。
但我最终真正想做的是对我的Projelements
进行查询,使用上面的逻辑检索最后更新的Projelement
,就像使用属性进行查询一样。
以前,我尝试使用一种仅属性的方法:
尝试使用updated_at
属性:如果更新Projelement
的属性,则此时间戳会更新,但如果更新嵌入的Comments
,则不会更新。因此,每当添加Comment
时,我都可以手动更新this_projelement.updated_at
。但设计感觉很脆弱。
还考虑有一个单独的属性(例如last_updated_at
),这样updated_at
的现有语义就不会被打乱。但设计也让人感觉脆弱。
Rails的方式是什么?
对于MongoDB,没有通过某些嵌入式文档字段进行订购的解决方案。
在您的案例中,在Comment中执行before_save回调并更新父文档中的属性的解决方案似乎是最合理的技术。