在我的应用程序中,我有一个名为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