将属性推迟到关联

时间:2013-11-20 19:01:47

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord associations

我有一个ActiveRecord模型(我将其称为所有者),它实际上是另一种模型的容器(我将其称为 posession < / em>)通过关联存储在has_many中。实际上,它的几乎所有属性都是基于来自其众多 posessions 的累积数据。

例如,它需要一个开始和结束年份,这将基于其 posessions 的最早和最近几年。它还需要有一个标记关联,该关联由其所有 posessions 中的所有标记组成。因此,所有所有者的有效性是来自其所有 posessions 的数据的枚举。

我应该如何处理?我需要所有者可以使用* pg_search *进行搜索,因此我无法使用虚拟属性作为访问者来枚举 posessions 的属性,这将是非常的昂贵。

每当保存 posession 时,我是否应该让所有者重新计算其属性,以便每次更改时只重新计算一次,而不是每次需要时重新计算?

我不知道如何处理这个问题,所以任何建议都会受到赞赏。

1 个答案:

答案 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连接兼容?

编辑:哎呀,初步查找应该是所有者,而不是占有。