2009-03-06 10 views
5

Voici ce que j'essaie de réaliser: J'ai une table Utilisateurs et chaque utilisateur peut être une douzaine de types: acteur, danseur, réalisateur, ... qui est déterminé après l'inscription. Chaque type d'utilisateur peut avoir n'importe quel nombre de profils. Par exemple. les acteurs peuvent avoir n'importe quel nombre de actor_profiles, les danseurs ont un nombre quelconque de profils_dancer, ...Association polymorphe Ruby on Rails

Le problème est de savoir comment lier le profil avec l'utilisateur. Une solution évidente serait de créer une table supplémentaire pour chaque type de profil, de sorte que je puisse utiliser un owner_to polymorphe dans User, puis un simple belongs_to dans chaque profil, mais cela semble moins qu'optimum. Un moyen sans doute meilleur serait de dire aux rails que l'utilisateur est de type acteur, de sorte que user.profiles fonctionnerait naturellement, sans aucun encombrement. Est-ce que les rails supportent un tel comportement, ou y a-t-il quelque chose de mieux que l'ancienne méthode? Merci.

Répondre

1

définir les relations dans les sous-classes:

class User < ActiveRecord::Base 
end 

class Actor < User 
    has_many :profiles, :class_name => "ActorProfile" 
end 

class Dancer < User 
    has_many :profiles, :class_name => "DancerProfile" 
end 
3

La réponse de PJB utilise une seule table Héritage. Pour que cela fonctionne, vous devez ajouter une colonne appelée type à vos utilisateurs et à vos tables Profiles *, afin que Rails puisse enregistrer quel type d'utilisateur c'est (puisque Actor, Dancer etc. ne sont que des sous-classes de User). Cela signifie qu'ils seront tous enregistrés dans les tables users/profiles, mais lorsque vous les instanciez, ActiveRecord les instanciera comme le type correct. Avec cela, vous serez en mesure d'appeler

User.find 

mais aussi faire des choses comme

Actor.find, Actor.all, etc 

et l'ont scope uniquement les acteurs

Google rails single table inheritance pour plus de détails et d'exemples.

  • Bien sûr, vous aurez besoin de déclarer votre profil sous-classes de la même façon que vous avez déclaré votre utilisateur
  • sous-classes

classe Profil < ActiveRecord :: Base belongs_to: l'utilisateur final

classe ActorProfile < Profil fin

classe DanseurProfil < Profil fin

etc

0

Vous devez vous assurer que votre table utilisateur a une colonne appelée "type". Rails enregistrera le TYPE de la classe (utilisateur, acteur, etc.) dans ce champ de base de données.