2011-04-22 40 views
0

忍受我一秒鐘...返回涉及STI和子類親子關係的記錄結果

我有兩個模型:HorseRaceEvent和Wagerable。

Wagerable使用STI和兩個子類:Trifecta和Wager。

Trifecta和下注之間有親子關係。對於一個Trifecta,有3個與它相關的投注。爲了使Wager和它的父節點Trifecta之間建立關聯,我使用了引用Trifecta記錄的Wager記錄的parent_id列。如果賭注不是Trifecta的一部分,那麼parent_id爲空。 (PARENT_ID的三連勝總是空。)

所以:

  • 三連勝有很多的投注
  • 賭注屬於三連勝

現在進入HorseRaceEvent。

  • HorseRaceEvent有很多投注。
  • 賭注屬於HorseRaceEvent。

注意:請注意,與HorseRaceEvent的關係是Wager,而不是Wagerable或Trifecta。 (對於Trifecta記錄,horse_race_event_id始終爲空。)

HorseRaceEvent具有一個名爲'status'的屬性,可以具有三種狀態:Not Started,Started,Final。

Wagerable有一個名爲「結果」有一個三值的屬性:空,W,L

這裏的挑戰:

對於三連勝的模式,我想實現一個named_scope或靜態方法返回所有的Trifectas,其中(1)結果爲空,(2)其子游戲關聯的HorseRaceEvent的每一個都是'Final'。

+0

HorseRaceEvent has_one Wager? – fl00r 2011-04-22 18:43:51

回答

0
  1. 我不知道,這是酷在這裏使用STI(我看不到全貌,所以它只是意見)。是的,這是非常相同的表結構,但不同的邏輯。所以他們應該是獨立的模型和表格。

  2. 關於你的問題。

這不是很聰明的解決方案,因爲perfomance,但對於小桌子就沒問題。

class Trifecta < Wagerable 
    def self.some_def_name 
    Trifecta.all.select{ |t| t.wagers.all?{ |w| w.horse_race_event.status == "Final" } } 
    end 
end 

幾乎沒有改善

class Trifecta < Wagerable 
    def self.some_def_name 
    Trifecta.includes(:wages => :horse_race_event). 
     where(:wages => {:horse_race_event => {:status => "Final"}}). 
     all. 
     select{ |t| t.wagers.all?{ |w| w.horse_race_event.status == "Final" } } 
    end 
end 

爲了提高性能比較,並在此創建SQL查詢,你可以到wagerables表列至極新列添加如果所有horse_race_event.status每個wagerFinal將存儲如此。

或者您可以編寫原始SQL查詢,它將返回所有Trifectas計數加入投注次數爲加入投注次數equael加入horse_race_event狀態=='最終'。

但最好的解決方案是優化您的架構。

+0

太棒了。謝謝。我其實很喜歡你關於添加一列來跟蹤事件是否最終的建議。簡單的布爾值將簡化查詢。 – keruilin 2011-04-24 03:57:53