5

Ich verwende ein STI-Modell mit einer einzigen "Accounts" -Tabelle, um Informationen für Benutzer und Techniker zu halten (zB Benutzer < Account, Techniker < Account). Alles funktioniert aus funktionaler Sicht, aber die Dinge explodieren beim Laufen Unit-Tests:Ruby on Rails Einzeltabellenvererbung (STI) und Einheitentestproblem (mit PostgreSQL)

... 8) Fehler: test_the_truth (Usertest): Active :: StatementInvalid: PGError: ERROR: relation "Techniker" ist nicht vorhanden : DELETE FROM „Techniker“ ...

Wesentlichen die Standard-Framework erkennt nicht, dass die Techniker und Anwender-Tabellen (oder „Beziehungen“, wie PostgreSQL sie nennt) nicht existieren und in der Tat sollte Alias ​​für Accounts sein.

Irgendwelche Ideen? Ich bin relativ neu in RoR und ich bin ratlos, wie ich das beheben kann, ohne STI alle zusammen zu reißen.

+0

Können Sie sowohl den Komponententest, der den Fehler generiert, als auch die Methode, die er aufruft, wenn der Fehler auftritt, posten? –

Antwort

12

Es stellte sich heraus, dass das Problem der Anwesenheit von Grund war:

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

diesem Sinne als die macht Framework erwartet, dass Daten in ähnlich benannte Tabellen eingefügt werden können.

+1

<3 Stapelüberlauf. Ich wünschte, ich könnte dich mehr modeln! – nfm

0
  • Haben Sie sichergestellt, dass Ihre Kontentabelle eine 'type' Spalte enthält? Sie brauchen einen, um STI arbeiten zu lassen.
  • Ich hatte tatsächlich einige Probleme mit der Datenbankkompatibilität mit einer Spalte namens "type" und haben gelegentlich auf "Art" umgeschaltet, um das zu lindern. Das könnte das Problem sein; versuchen Sie, self.inheritance_column = "kind" in der Basisklasse (Account) zu setzen und sehen Sie, ob das hilft.
+0

Die Konten enthielten eine "type" -Spalte und leider hat Ihr Vorschlag, den Namen in "kind" zu ändern, nicht geholfen. Die Probleme bestehen fort. –

2

Ich hatte ein ähnliches Problem, das durch Entfernen der YAML-Datei für das Kindmodell gelöst wurde. Im Wesentlichen betrachtet rails die Fixtures, die in/test/fixtures/erstellt wurden und versucht die Tabellen für jeden zu leeren, damit er sie für Sie neu laden kann.

In meinem Fall hatte ich den Script/Generate Model Befehl ausgeführt, der automatisch ein neues Fixture erstellt. Dann habe ich das Modell so geändert, dass es von der richtigen Elternklasse erbt. Nun, da die Fixture noch existierte, versuchte rails das FROM DELETE FROM, bevor die Fixtures geladen wurden.

Wenn Sie wirklich Daten vorab laden müssen, sollten Sie das Elternmodell-Fixture verwenden und das Typfeld auf den richtigen Modellnamen einstellen.