5

In meiner Datenbank habe ich eine Tabelle people, und ich bin mit Vererbung einzigen Tabelle, mit diesen Klassen:Rails STI und Multi-Level-Vererbung fragt

class Person < ActiveRecord::Base 
end 

class Member < Person 
end 

class Business < Member 
end 

Demonstration of the problem

Die Abfragen es confuse erzeugt mich. Was ich will, ist für Member.all, um alle Unternehmen sowie alle anderen Untertypen von Mitglied zurückzugeben. Was es tut, aber nur, wenn ich kürzlich auf die Business-Klasse zugegriffen habe. Ich nehme an, dass es daran liegt, dass meine Klassen im Entwicklungsmodus nicht zwischengespeichert werden (aus offensichtlichen Gründen), aber es scheint immer noch wie seltsames/fehlerhaftes Verhalten.

Ist das ein Fehler in Schienen? Oder funktioniert es wie beabsichtigt? In jedem Fall kann jemand an eine gute Lösung für Entwicklungszwecke denken?

+0

Bitte geben Sie die Vererbungsarten in jeder Klasse an. –

+0

Was meinst du, mein Sohn? – Obversity

Antwort

1

Dies ist beabsichtigt verhaltens die Führungs offizielle Rails auf Autoloading and Reloading Constants es ziemlich gut im Abschnitt erklärt auf Autoloading and STI:

...

Ein Weg, um sicherzustellen, funktioniert das entspricht ctly unabhängig von der Reihenfolge der Ausführung ist es, die Blätter des Baumes mit der Hand an der Unterseite der die Datei zu laden, die die Wurzelklasse definiert:

# app/models/polygon.rb 
class Polygon < ApplicationRecord 
end 
require_dependency 'square' 

nur die Blätter, die zumindest Enkelkinder geladen werden müssen dies Weg. Direkte Unterklassen müssen nicht vorab geladen werden. Wenn die Hierarchie tiefer liegt, werden intermediäre Klassen rekursiv von am unteren Rand geladen, da ihre Konstante in den Klassendefinitionen als Oberklasse erscheint.

In Ihrem Fall würde dies bedeuten, dass Sie eine require_dependency "business" am Ende Ihrer Klasse Person setzen.

jedoch von zirkulären Abhängigkeiten passen, die möglicherweise durch die Verwendung require statt require_dependency vermieden werden kann (obwohl es Rails von Tracking-und Nachladen von Dateien zu verbieten, wenn Änderungen vorgenommen-nach sind alle, require_dependency ist eine Rails-interne Methode) .

+0

Das ist eine interessante Lösung. Ich werde versuchen, dass das nächste Mal das kommt! – Obversity

3

Standardmäßig lädt Rails Ihre Klassen nicht in der Entwicklung. Versuchen Sie, die folgende Zeile in config/environments/development.rb Wechsel:

# Do not eager load code on boot. 
config.eager_load = false 

zu:

# Do eager load code on boot! 
config.eager_load = true 
+0

Schöner Gedanke! Es scheint in der Dummy-App funktioniert zu haben, die ich gemacht habe, um das Problem zu replizieren, aber löste nicht alle meine Probleme in meiner realen APP (die durch andere Dinge verursacht werden könnte). Ich werde später als akzeptiert markieren, wenn ich Zeit habe, es richtig zu testen. Vielen Dank! – Obversity