En mi aplicación, tengo una clase llamada Presupuesto. El presupuesto puede ser de muchos tipos ... Por ejemplo, digamos que hay dos presupuestos: FlatRateBudget y HourlyRateBudget. Ambos heredan de la clase Presupuesto.¿Cómo ejecutar validaciones de subclase en herencia de tabla única?
Esto es lo que me pasa hasta el momento:
class Budget < ActiveRecord::Base
validates_presence_of :price
end
class FlatRateBudget < Budget
end
class HourlyRateBudget < Budget
validates_presence_of :quantity
end
En la consola, si lo hago:
b = HourlyRateBudget.new(:price => 10)
b.valid?
=> false
b.errors.full_messages
=> ["Quantity can't be blank"]
Como, espera.
El problema es que el campo "Tipo", sobre ITS, proviene de params .. Así que tengo que hacer algo como:
b = Budget.new(:type => "HourlyRateBudget", :price => 10)
b.valid?
=> true
Lo que significa que los carriles se está ejecutando validaciones en el super-clase en vez de instanciar la sub clase después de configurar el tipo.
Sé que es el comportamiento esperado, ya que estoy instanciando una clase que no necesita el campo de cantidad, pero me pregunto si de todos modos hay que indicarle a los rieles que ejecuten las validaciones para la subclase en lugar del super.
Al usar STI, evitaría crear instancias de objetos de la superclase y solo funciona con las clases base, y creo que Rails utilizará las validaciones apropiadas de la superclase y las exclusivas de la subclase. – firecape