Sti -Inheizanz in Schienen. Probleme mit Find
-
18-09-2019 - |
Frage
Ich habe ein Problem mit der Suche nach Datensätzen in meiner STI -Tabelle aufgrund meiner Erbschaftsstruktur
class User < ActiveRecord::Base
class LegacyUser < User
class AuthUser < User
class SuperUser < AuthUser
class FieldUser < AuthUser
class ClientAdmin < AuthUser
Das Problem ist, dass Find nicht für das Authusermodell funktioniert. Die Abfrage sucht nach dem Typ "Authuser" und enthält nicht die anderen drei Möglichkeiten.
Bearbeiten: Während des Spiels damit begann es zu funktionieren, aber nur für ClientAdmin und Fielduser, so dass diese Funktionalität eingebaut werden sollte. Aber jetzt ist es wieder zum ursprünglichen Problem zurückgekehrt
Lösung
Ich bin gerade auf das gleiche Problem gestoßen und habe eine Lösung gefunden hier.
Kurz gesagt, das Problem ist, dass Ihre mittlere abstrakte Klasse keine Möglichkeit gibt, zu wissen, welche Unterklassen vor ihrer Belastung sind. Um dies zu umgehen, können Sie alle Unterklassen am Ende der Datei der Klassen manuell laden.
Also am Ende von Auth_user.rb:
require_dependency 'super_user'
require_dependency 'field_user'
require_dependency 'client_user'
Andere Tipps
Wird das Authusermodell selbst verwendet?
Wenn es sich nur um eine Klasse für gemeinsame Methoden zwischen den ererbten Klassen handelt, können Sie versuchen, sie als abstrakte Klasse festzulegen. Auf diese Weise könnte Activerecord direkt durch die Seite gehen.
In der Deklaration des Authusers fügen Sie einfach hinzu self.abstract_class = true
so was:
class AuthUser < User
self.abstract_class = true
end
Ich weiß nicht, ob das in diesem Szenario funktioniert, aber es könnte einen Versuch wert sein.
Aufgrund der Art und Weise, wie STI in Rails funktioniert (es speichert den Modellnamen in einer Datenbankspalte namens "Typ"), sehe ich nicht, wie die Hierarchie, die Sie oben beschreiben, unterstützen kann - ich denke, Sie sind auf eine einzelne Hierarchie beschränkt.