我有一个ActiveRecord模型(我将其称为所有者),它实际上是另一种模型的容器(我将其称为 posession < / em>)通过关联存储在has_many
中。实际上,它的几乎所有属性都是基于来自其众多 posessions 的累积数据。
例如,它需要一个开始和结束年份,这将基于其 posessions 的最早和最近几年。它还需要有一个标记关联,该关联由其所有 posessions 中的所有标记组成。因此,所有所有者的有效性是来自其所有 posessions 的数据的枚举。
我应该如何处理?我需要所有者可以使用* pg_search *进行搜索,因此我无法使用虚拟属性作为访问者来枚举 posessions 的属性,这将是非常的昂贵。
每当保存 posession 时,我是否应该让所有者重新计算其属性,以便每次更改时只重新计算一次,而不是每次需要时重新计算?
我不知道如何处理这个问题,所以任何建议都会受到赞赏。
答案 0 :(得分:1)
你看过使用SQL连接吗?类似的东西:
@owners = Owner.find(
:all,
:select => 'owners.*, sum(possessions.amount) as total_amount',
:joins => 'left outer join possessions on possessions.owner_id = owners.id',
:conditions => { 'owners.active => false },
:group => 'owners.id',
:order => 'owners.name'
)
这为您提供了与您在select调用中定义的额外属性的ActiveRecord关系,因此在这种情况下,您可以将sum作为普通属性访问,例如
@owners.first.total_amount
不太确定pg_search是如何工作的,但似乎它与SQL连接兼容?
编辑:哎呀,初步查找应该是所有者,而不是占有。