2009-07-21 8 views
12

J'ai deux modèles, les utilisateurs et les groupes. Chaque groupe peut avoir plusieurs utilisateurs et chaque utilisateur peut être dans plusieurs groupes.Rails (ActiveRecord) plusieurs à plusieurs table

J'ai actuellement quelque chose de simple comme:

utilisateur:

has_many :groups 

Groupe:

has_many :users 

J'ai une table de groups_users qui est juste de créer des lignes avec group_id et user_id. Je veux ajouter une autre colonne à cela, (que j'ai), la question est comment puis-je y accéder à partir d'un modèle sans utiliser un appel SQL personnalisé? Dans le modèle de groupe, je peux aller self.users et dans l'utilisateur, je peux aller self.groups

Existe-t-il un moyen de changer la troisième colonne de ce tableau d'un modèle d'utilisateur?

Désolé si cela est source de confusion, s'il vous plaît conseiller sur ce

Répondre

12

Voici quelques tutoriels qui devraient aider. Fondamentalement, il existe deux approches pour faire un travail plusieurs-à-plusieurs, soit a_et_s'appuie sur beaucoup ou a_many: à travers (recommandé).

liens:

  1. http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off
  2. http://railscasts.com/episodes/47-two-many-to-many
  3. http://railscasts.com/episodes/154-polymorphic-association
+0

Surtout le 2ème lien. Grand exemple de has_and_belongs_to_many en action. –

+0

Ces liens sont-ils toujours pertinents =? – shem

2

I [ajouté] une autre colonne [users_groups] ... La question est de savoir comment je accès à partir d'un modèle sans utiliser un SQL personnalisé c tout?

On dirait que vous voulez accéder à une colonne de votre table user_groups en appelant une méthode sur votre modèle User ou votre modèle Group.

Quelques suggestions:

Je nomme la table « user_groups » pour travailler avec les attentes de ActiveRecord de pluriel des noms, mais je ne suis pas sûr si cela est essentiel.

Suivant les conseils de Dave, vous voudriez mettre les choses en utilisant la technique « has_many :through » ...

# Declare a Model based on the many-to-many linking table. 
class UserGroup < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :user_groups 
    has_many :groups, :through => :user_groups 
end 

class Group < ActiveRecord::Base 
    has_many :user_groups 
    has_many :users, :through => :user_groups 
end 

Est-il possible de changer la troisième colonne dans ce tableau à partir d'un modèle utilisateur ?

Ceci est un peu floue, mais gardez à l'esprit que chaque User peut avoir beaucoup de UserGroups. Donc, si vous vouliez changer cette troisième colonne, vous devriez trouver celle que vous recherchez.

+0

Si vous n'avez pas besoin de données supplémentaires dans la table UserGroup, ignorez son ActiveRecord entièrement et utilisez les associations 'has_and_belongs_to_many' entre Utilisateur et Groupe avec une table de jointure. Voir le deuxième lien sur l'autre réponse. –

+0

dans django, il est facile d'ajouter une troisième colonne à une table de plusieurs à plusieurs: il suffit d'ajouter le champ au modèle auquel on accède aussi par "à travers". Une autre colonne dans votre exemple est utile si vous e. g. vouloir donner à l'utilisateur un certain état (actif ou non) dans le groupe. – Timo

7

Dans Rails 3, vous souhaitez créer une table de jointure pour plusieurs relations, en utilisant les noms pluriels des tables que vous souhaitez joindre dans l'ordre alphabétique. Donc, dans ce cas, ce serait groups_users.

modèles

class GroupsUser < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :groups_users 
    has_many :groups, :through => :groups_users 
end 

class Group < ActiveRecord::Base 
    has_many :groups_users 
    has_many :users, :through => :groups_users 
end 
+1

Serait intéressant de savoir comment accéder à un domaine connexe en vue – Timo

Questions connexes