将属性延迟到关联



我有一个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联接兼容?

编辑:哇,最初的发现应该在所有者身上,而不是占有

最新更新