La única estrategia totalmente compatible para almacenar herencia en ActiveRecord es STI. Sin embargo, puede simular una herencia concreta de tablas de clase bajo su propio riesgo. La herencia concreta de la tabla de clases con la superclase abstracta funciona bien, tal como lo señala smathy.
pero ... si lo que quiere es hacer AnotherSection simplemente una clase ordinaria (que no se conservará en la base de datos), que podría desactivar la columna discriminadora (según lo sugerido por Veraticus). Sin embargo, si guarda el AnotherSection, se mantendrá en la misma tabla que Sección, y no podrá diferenciarlos. Además, si se utiliza AnotherSection encontrar un Sección, se devolverá un AnotherSection, rompiendo la creación de instancias originales:
#create a Section and saves it
sect = Section.create()
sect.save()
#retrieve the Section as a AnotherSection, breaking polymorphism...
sect = AnotherSection.find(sect.id)
# another section is more than a section, it is inconsistent.
Si AnotherSection no pretende ser persistido, el camino más seguro que para anular las operaciones de persistencia, como Save() y encontrar():
class AnotherSection < Section
# disable STI, as pointed by Veraticus
self.inheritance_column = :_type_disabled
# disable save and finding
def save(*args)
#exception? do nothing?
end
def find(*args)
#exception? do nothing?
end
def find_by(*args)
#exception? do nothing?
end
# this does not stops here! there is first, last, and even a forty_two finder method! not to mention associations...
end
en pocas palabras, se puede hacer esto, pero No deberías. El riesgo es alto Debería considerar otra opción, como usar MIXIN en lugar de herencia.
si no tiene una columna de 'tipo' que no debería molestarle ... si tiene un 'tipo', entonces puede desactivarlo haciendo lo que @Veraticus dijo ... – shuriu
De hecho, usted todavía tener STI: las instancias de ambas clases se almacenarán en la misma tabla, ¿cuál es la definición de ITS (herencia de tabla única)? Simplemente no desea tener una columna discriminatoria (el "tipo"). Sin embargo, ¿cómo sabrá si cada registro de las secciones es una sección simple o una OtraSección? – atorres