2012-02-07 92 views
2

我想爲我的一些模型使用單表繼承。基本模型是一個錦標賽,我希望擴展它來創建不同類型的錦標賽。例如,我可能想添加一個SingleEliminationTournament或者DoubleEliminationTournament,這兩個都可以從Tournament繼承。我有兩個問題,兩者都有些相關。使用單表繼承(STI)時驗證類型的正確方法是什麼?

1)我希望用戶能夠使用表單創建錦標賽,要做到這一點,他們需要選擇其中一個子類。有沒有辦法讓所有的子類,並使用它們填充選擇框或類似的東西?

2)由於這些信息將進入表單,因此能夠驗證輸入類型是非常好的。爲了做到這一點,我想在Tournament類中添加一個可以檢查確認Type是否有效的驗證。

很明顯,我可以將這些值硬編碼到驗證和表單中,但我不想這樣做。任何幫助,將不勝感激。謝謝!

回答

1

您可以在其中創建一個包含錦標賽的目錄並使用Dir.glob('app/tournaments/**/*_tournament.rb')加載它們。這給你一個很好的列表,你已經指定的所有比賽文件。由於慣例,你可以推斷每個錦標賽的正確名字。

將此比賽名稱列表存儲在某處供您參考驗證和表單。

+0

這絕對不是理想的,但我最終使用這種解決方案。謝謝。 – Max 2012-02-09 19:39:48

1
TheModel.subclasses 

會給你一個你需要包含的類型列表,但只有在模型在運行時被加載。它們將始終以生產模式加載。您將不得不在開發模式下手動加載它們。

0

我不是一個Rails的專家,我不知道如果這也算乾淨,但對於你的問題的驗證部分,這個工作對我來說:

內部比賽模式:

def validate_type_implemented 
    klass = type.constantize rescue Object 
    raise "Given type not available." unless klass.class == Class and klass <= self.class 
end 
相關問題