5 Stimmen

Ruby on Rails Einzeltabellenvererbung (S

Ich verwende ein STI-Modell mit einer einzigen Tabelle "Konten", um Informationen für Benutzer und Techniker zu speichern (d. h. Benutzer < Konto, Techniker < Konto). Aus funktionaler Sicht funktioniert alles, aber die Dinge explodieren, wenn Unit-Tests ausgeführt werden:

... 8) Fehler: test_the_truth(UserTest): ActiveRecord::StatementInvalid: PGError: ERROR: Relation "Techniker" existiert nicht : DELETE FROM "techniker" ...

Im Wesentlichen erkennt das Standard-Framework nicht, dass die Tabellen Techniker und Benutzer (oder "Relationen", wie PostgreSQL sie nennt) nicht existieren und eigentlich in Accounts umbenannt werden sollten.

Irgendwelche Ideen? Ich bin relativ neu bei RoR und ich bin ratlos, wie ich das beheben kann, ohne STI ganz herauszureißen.

12voto

David Carney Punkte 2200

Es stellte sich heraus, dass das Problem auf das Vorhandensein von zurückzuführen war:

./test/fixtures/technicians.yml ./test/fixtures/users.yml

Dies ist sinnvoll, da das Framework erwartet, Daten in ähnlich benannte Tabellen einfügen zu können.

2voto

Robert Jackson Punkte 21

Ich hatte ein ähnliches Problem, das durch das Entfernen der YAML-Datei für das untergeordnete Modell behoben wurde. Im Wesentlichen schaut sich Rails die Fixtures an, die in /test/fixtures/ erstellt wurden, und versucht, die Tabellen für jede zu leeren, damit sie für Sie neu geladen werden können.

In meinem Fall hatte ich den Befehl Skript/Modell generieren ausgeführt, der automatisch eine neue Halterung erstellt. Dann habe ich das Modell so geändert, dass es von der richtigen übergeordneten Klasse erbt. Nun, da das Fixture noch existierte, versuchte Rails vor dem Laden des Fixtures FROM child zu LÖSCHEN.

Wenn Sie wirklich Daten vorladen müssen, sollten Sie die Halterung für übergeordnete Modelle verwenden und das Feld type auf den richtigen Modellnamen setzen.

0voto

Brian Guthrie Punkte 2758
  • Haben Sie sichergestellt, dass Ihre Konten-Tabelle eine Spalte "Typ" enthält? Sie brauchen eine, damit STI funktioniert.
  • Ich hatte tatsächlich einige Probleme mit der Datenbankkompatibilität einer Spalte namens "type" und habe gelegentlich zu "kind" gewechselt, um das Problem zu lösen. Das könnte das Problem sein. Versuchen Sie, self.inheritance_column = "kind" in der Basisklasse (Account) zu setzen und sehen Sie, ob das hilft.

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