2010-08-17 15 views
13

Ich arbeite derzeit an einer Rails 3-Anwendung, die aussieht, als müsste sie für einige Modelle Class Table-Vererbung verwenden.Klassentabellenvererbung in Rails 3

Ein vereinfachtes Beispiel für das, was vor sich geht, ist dies.

Ich habe eine Klasse namens Person mit allgemeinen Attributen wie Name, E-Mail, Passwort, die für alle Arten von Menschen in der Anwendung und für die Authentifizierung verwendet werden.

Es gibt zwei Unterklassen für Person (oder zwei Arten von Personen ...), Fahrer und Beifahrer. Beide Unterklassen teilen die generischen Attribute von Person, haben dann jedoch spezifische zusätzliche Attribute, die für sie selbst einzigartig sind. (Zum Beispiel kann ein Fahrer viele Fahrzeuge und Lizenzen haben, aber ein Passagier würde nicht)

Wie würde ich CTI für diese Art von Situation implementieren? Ich habe ein Beispiel suche hier zur Verfügung gestellt:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

Aber es ist nicht zu spekulieren, wie die gemeinsamen Attribute einer Person von einem Fahrer oder Passagier-Objekt zuzugreifen, und ich bin ein wenig verwirrt durch Das.

Insbesondere, was ich möchte wissen, ist:

Wenn ich die Attribute eines Treiber-Aktualisierung, wie kann ich leicht die relevanten Attribute auf der übergeordneten Menschen Tabelle zugreifen und diese aktualisieren? Muss ich mich in einen after_save Callback einklinken und ausscheiden, welche Attributaktualisierung wohin geht? Oder gibt es einen besseren Weg, dies zu erreichen?

+0

Ich sollte hinzufügen, dass dies ein vereinfachtes Beispiel dafür ist, was tatsächlich in meiner App passiert. Ich bin sicher, dass ich in meiner Situation die Vererbung von Klassentabellen implementieren muss, Single Table Inheritance wäre nicht der beste Weg. –

+0

Ich habe einen Kommentar zu dem Blog geschrieben, auf den ich in meiner Frage Bezug genommen habe und der Autor hat freundlicherweise ein Beispiel für eine Möglichkeit gegeben: http://rhnh.net/2010/08/17/updating-class-table-inheritance- Tabellen (Sie rocken Xavier!) –

Antwort

5

warum nicht Single Table Vererbung verwenden? zum Beispiel:

class Person < ActiveRecord::Base 
    # some common code here 
end 

class Driver < Person 
    # Driver code 
end 

class Passenger < Person 
    # Passenger code 
end 

auf diese Weise Sie eine gemeinsame Klasse Person haben werden, plus zwei abgeleitet bestimmte Klassen von ihm

+13

Hinweis: Das OP fragte nach der Verwendung der Klassentabellenvererbung und nicht nach der Vererbung einzelner Tabellen. –

+21

manchmal fragen Leute nach der falschen Frage, ich habe gerade eine mögliche Lösung für sein Problem beantwortet. –

+9

Dann sollte es als Kommentar vorgeschlagen werden. – EdMelo

4

ich die Klasse Tabelle Vererbung Plugin bin mit und es funktioniert gut, http://github.com/brunofrank/class-table-inheritance

+0

Danke für den Tipp, ich überprüfe das Plugin! –

+4

Nicht die beste Lösung, weil es nicht gut mit Postgres funktioniert (dh, benutze das nicht, wenn du Heroku mit Postgres verwenden willst) – standup75

2

Kürzlich habe ich ein vielversprechendes Projekt ausgearbeitet, um die Vererbung von mehreren Tabellen und die Klassenvererbung in Rails zu implementieren. Ich habe es ein paar Tage lang der schnellen Entwicklung, Fixes, Kommentaren und Dokumentation unterzogen und es als CITIER (Class Inheritance und Table Inheritance Embeddings for Rails) erneut veröffentlicht.

Ich denke, Sie könnten es möglicherweise mit den obigen Antworten kombinieren?

Betrachten Sie es sehen geben: http://peterhamilton.github.com/citier

ich an Lösungen wie die Klasse-table-Erbe Repo sah, aber das ist viel sauberer und logische IMO.

Es unterstützt auch die wichtigsten SQL-Sprachen SQLite, MySQL, PostgreSQL und wahrscheinlich mehr, aber ich habe sie nicht getestet.

+0

Dieses Juwel scheint das kompletteste Merkmal der drei zu sein. Darf ich fragen, ob Sie sich den Leistungsvergleich angesehen haben? Und auch die Integration mit Sunspot (da DB-Views verwendet werden)? – lulalala

+0

Funktioniert gut ... aber wir haben viele Probleme mit Heroku. Es hat die Tischansichten nicht gefallen, besonders wenn man db drückt/zieht. Endete es zu entfernen. – Ricky

7

Auch gibt es ein Plugin 'acts_as_relation', dies zu tun,
https://github.com/hzamani/acts_as_relation/

in Ihrem Fall wird der Code sein:

class Driver < ActiveRecord::Base 
    acts_as :person 
end 

class Passenger < ActiveRecord::Base 
    acts_as :person 
end 

nicht person_type und person_id Spalten hinzufügen Vergessen Sie persons Tabelle.
Jetzt erben sowohl Laufwerk als auch Passagier Personenattribute, Validierungen und Methoden.