Die einzige vollständig unterstützte Strategie zum Speichern der Vererbung auf ActiveRecord ist STI. Sie können jedoch eine konkrete Vererbung der Klassen-Tabelle auf eigenes Risiko simulieren. Die konkrete Klassen-Tabellen-Vererbung mit abstrakter Oberklasse funktioniert gut, wie Smathy zeigt.
ABER ... Wenn Sie möchten, ist AnotherSection nur eine gewöhnliche Klasse (die nicht in der Datenbank beibehalten wird), können Sie die Diskriminator-Spalte deaktivieren (wie von Veraticus vorgeschlagen). Wenn Sie jedoch die AnotherSection speichern, wird es in der gleichen Tabelle wie Abschnitt gespeichert, und Sie können sie nicht voneinander unterscheiden. Auch, wenn Sie verwenden AnotherSection zu finden, ein Abschnitt, wird es geben eine AnotherSection, brechen die ursprüngliche Instanziierung:
#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.
Wenn AnotherSection ist nicht beibehalten werden soll, den sichersten Weg es die Persistenz Operationen, wie save() und finden() außer Kraft zu setzen:
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
auf den Punkt gebracht, können Sie dies tun, aber Hier darf man sich. Das Risiko ist hoch. Sie sollten eine andere Option in Erwägung ziehen, z. B. die Verwendung von MIXIN anstelle von Vererbung.
Wenn Sie nicht eine 'type'-Spalte haben, die Sie nicht stören sollte ... wenn Sie einen' type' haben, dann können Sie es deaktivieren, indem Sie tun, was @Veraticus sagte .. – shuriu
In der Tat Sie immer noch haben STI: Instanzen von beiden Klassen werden in der gleichen Tabelle gespeichert, was ist die Definition von STI (Single Table Inheritance). Sie wollen einfach keine Diskriminatorspalte (den "Typ") haben. Wie werden Sie jedoch wissen, ob jeder Datensatz aus Abschnitten ein einfacher Abschnitt oder ein anderer Abschnitt ist? – atorres