2009-08-18 6 views
2

J'ai un problème avec la recherche de dossiers dans mon tableau STI en raison de ma structure d'héritageSTI Inheiritance dans les rails. Problèmes liés à trouver

class User < ActiveRecord::Base 

class LegacyUser < User 

class AuthUser < User 

class SuperUser < AuthUser 

class FieldUser < AuthUser 

class ClientAdmin < AuthUser 

Le problème est que trouver ne fonctionne pas pour le modèle AuthUser. La requête recherche le type "AuthUser" et n'inclut pas les trois autres possibilités.

Edit: Tout en jouant avec cela, il a commencé à travailler mais seulement pour ClientAdmin et FieldUser il semble que cette fonctionnalité devrait être construit en mais maintenant il est retourné à la question d'origine

Répondre

3

Je viens de rencontrer ce problème et j'ai trouvé une solution here. En résumé, le problème est que votre classe abstraite intermédiaire n'a aucun moyen de savoir quelles sont ses sous-classes avant qu'elles ne soient chargées. Pour contourner ce problème, vous pouvez charger manuellement toutes les sous-classes au bas du fichier de ces classes.

Donc, au fond de auth_user.rb:

require_dependency 'super_user' 
require_dependency 'field_user' 
require_dependency 'client_user' 
0

En raison de la façon dont les IST. fonctionne dans Rails (il stocke le nom du modèle dans une colonne de base de données appelée 'type') Je ne vois pas comment il peut supporter la hiérarchie que vous décrivez ci-dessus - je pense que vous êtes limité à une hiérarchie à un seul niveau.

+0

J'ai la colonne Type dans mon Db. Au début, je pensais que je n'étais limité qu'à un niveau, mais à un moment donné, une recherche AuthLogic cherchait les 4 types de potentiel. Maintenant, il ne regarde que la base – stellard

2

Le modèle AuthUser va-t-il être utilisé seul?

Si ce n'est qu'une classe pour les méthodes partagées entre les classes héritées, vous pouvez essayer de le définir comme une classe abstraite. De cette façon, ActiveRecord pourrait passer à travers.

Dans la déclaration de AuthUser, il suffit d'ajouter self.abstract_class = true comme ceci:

class AuthUser < User 
    self.abstract_class = true 
end 

Je ne sais pas si cela fonctionne dans ce scénario, mais il pourrait être la peine d'essayer.

+0

La classe AuthUser contient la fonctionnalité partagée des 3 sous-classes. Le but de ces sous-classes supplémentaires est de répondre différemment en termes d'autorisations. – stellard

+0

Ok, cela devrait fonctionner. Je l'utilise comme ça tout le temps (mais pas au milieu d'une STI cependant). Dans les cas réguliers, en le définissant comme abstrait dirait à ActiveRecord de ne pas chercher une table pour ce modèle, donc dans STI il ne devrait pas (selon ma logique) ne pas rechercher ce type. Cela signifie que si vous avez besoin d'instancier ce modèle, cela ne fonctionnera pas, mais seulement en utilisant les sous-classes. –

Questions connexes