我有一个ActiveRecord模型(我称之为owner),它实际上是通过关联存储在has_many
中的另一种类型的模型(我将称为posession。)的容器。实际上,它几乎所有的属性都是基于其许多姿态的累积数据。
例如,它需要一个开始和结束年份,该年份将基于其任务的最早和最晚年份。它还需要有一个标签关联,该关联由其所有任务的所有标签组成。因此,所有所有者实际上都是其所有posessions的数据的枚举。
我该如何处理?我需要所有者可以使用*pg_search*进行搜索,所以我不能简单地使用虚拟属性作为访问器来枚举姿势的属性,这将非常昂贵。
每当任务被保存时,我是否应该考虑让所有者重新计算其属性,以便每次更改只重新计算一次,而不是每次需要时都重新计算?
我不知道该如何处理,所以任何建议都将不胜感激。
您看过使用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关系,因此在这种情况下,您可以将总和作为普通属性访问,例如
@owners.first.total_amount
不太确定pg_search是如何工作的,但它似乎与SQL联接兼容?
编辑:哇,最初的发现应该在所有者身上,而不是占有