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