4 Stimmen

Ist dies eine legitime Verwendung von Rails' Single Table Inheritance?

Ich habe gerade den Blogbeitrag von Chad Fowler über 20 Rails Entwicklung No-Nos . Zur Vererbung einer einzelnen Tabelle kommentiert er:

Die Speicherung einer Spalte namens "Typ", die einen Klassennamen enthält, ist ein ziemlich guter Indikator dafür, dass etwas faul ist. Es ist verdächtig, aber nicht immer schlecht. Ich denke jedoch, dass Sie sich jedes Mal, wenn Sie es verwenden, mehr als einmal fragen sollten, ob es die richtige Lösung ist. Datenbanken tun das, was sie am besten können, nicht so gut, wenn man viele STI und polymorphe Assoziationen hat.

Ich schreibe eine Blog-Anwendung und erwäge den Einsatz von STI für die Kommentare, die zu einem Beitrag abgegeben werden können, und für die Kontaktnachrichten, die Besucher eingeben können, wenn sie mit mir in Kontakt treten wollen. Mein Message Modell erbt von meinem Comment Modell. Beide haben gemeinsame Merkmale, außer dass sie Message haben eine zusätzliche subject Feld. Eine weitere Gemeinsamkeit ist, dass beide zur Spamprüfung an Akismet übermittelt werden.

Anstatt mich mehr als einmal zu fragen, ob es die richtige Lösung ist, wie Chad vorschlägt, dachte ich mir, dass ich auch ein paar Meinungen von den Stack Overflow-Experten einholen würde! Klingt das, was ich vorschlage, wie eine gute Lösung für STI?

2voto

Kris Punkte 18038

Ich habe STI schon mehrmals verwendet. Betrachten Sie ein CMS, das Page, NewsItem, BlogItem usw. haben könnte.

Sie könnten jeweils von einer gemeinsamen Klasse abstammen, die wiederum von ActiveRecord erbt. Die Tabelle für jedes Modell wäre dieselbe (title, body, tags, published_at), aber jedes Modell könnte unterschiedliche Assoziationen, unterschiedliche Status oder einen anderen Arbeitsablauf haben, so dass jedes Modell einen eigenen Code in seiner eigenen Klasse hat. Dennoch haben sie alle eine gemeinsame Tabelle und übergeordnete Klasse. Außerdem kann ich die übergeordnete Klasse verwenden, um eine klassenübergreifende Suche durchzuführen und das daraus resultierende Array von Datensätzen automatisch typisieren zu lassen.

Es gibt noch andere Möglichkeiten, dieses Problem zu lösen, und es ist vielleicht nicht das beste Beispiel, aber es gibt sicherlich Situationen, in denen STI nützlich ist, wenn sich das Verhalten von Objekten unterscheidet, der persistierte Zustand aber derselbe ist. Natürlich müssen Sie sicher sein, dass dies auch in Zukunft der Fall sein wird.

In Ihrem Fall sind Kommentare und Kontaktmeldungen unterschiedlich. Es hört sich so an, als ob es keinen Vorteil bringt, sie in derselben Tabelle zu haben. Vielleicht legen Sie den gemeinsamen Code in eine übergeordnete Klasse oder besser noch in ein Modul in /lib.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X