0

我有一个ActiveRecord模型(我将把作为所有者),其有效地是另一种类型的模型(我将称之为posession)通过关联存储在has_many容器。几乎所有的属性都基于其众多姿势的累积数据。推迟属性协会

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

我该如何处理?我需要所有者可通过* pg_search *进行搜索,因此我不能简单地使用虚拟属性作为访问者来枚举姿势的属性,而且这将非常昂贵。

我应该看看有所有者重新计算其属性每当posession被保存,以便他们只是每个变化,而不是每次都需要它们时重新计算一次?

我不知道如何处理这个,所以任何建议,将不胜感激。

+0

你看过使用连接吗? –

+0

@HeliosdeGuerra请你详细说明一下吗? – Undistraction

回答

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' 
) 

这给你和你的选择调用定义额外的属性一个ActiveRecord的关系,所以在这种情况下,你可以访问和作为一个正常的属性,例如

@owners.first.total_amount 

不太确定pg_search是如何工作的,但似乎它会与w/SQL连接兼容?

编辑:哎呀,最初的发现应该是所有者,而不是占有。

+0

谢谢。我猜这个方法的问题是这个属性只能在这个查询返回的ActiveRecord实例上可用。当'pg_search'或另一个Gem构建自己的查询时,它不会使用连接,所以这些属性将不会被添加。 – Undistraction