在我的應用程序中,我有一個名爲Budget的類。預算可以有多種類型。例如,假設有兩個預算:FlatRateBudget和HourlyRateBudget。兩者都從類Budget中繼承。如何在單表繼承中運行子類的驗證?
這是我得到迄今:
class Budget < ActiveRecord::Base
validates_presence_of :price
end
class FlatRateBudget < Budget
end
class HourlyRateBudget < Budget
validates_presence_of :quantity
end
在控制檯,如果我這樣做:
b = HourlyRateBudget.new(:price => 10)
b.valid?
=> false
b.errors.full_messages
=> ["Quantity can't be blank"]
爲,預計。
的問題是,在「類型」字段,在STI,來自PARAMS ..所以我需要做的是這樣的:
b = Budget.new(:type => "HourlyRateBudget", :price => 10)
b.valid?
=> true
這意味着軌道運行的驗證在超一流的,而不是在設置類型後實例化子類。
我知道這是預期的行爲,因爲我正在實例化一個不需要數量字段的類,但是我不知道是否有反正告訴rails爲子類而不是超級運行驗證。
當使用STI,我會避免實例從對象超類,並且只能與基類一起工作,我相信Rails將使用超類和子類獨有的適當驗證。 – firecape 2015-05-27 04:29:24