2009-07-21 12 views
12

Ho due modelli, utenti e gruppi. Ogni gruppo può avere molti utenti e ogni utente può essere in molti gruppi.Rails (ActiveRecord) tabella molti a molti

Al momento ho qualcosa di semplice come:

utente:

has_many :groups 

Gruppo:

has_many :users 

Così ho una tabella groups_users che è solo la creazione di file con group_id e user_id. Voglio aggiungere un'altra colonna a questo, (che ho), la domanda è: come posso accedervi da un modello senza usare una chiamata SQL personalizzata? Nel modello di gruppo posso andare self.users e in user posso andare self.groups

C'è un modo per cambiare la terza colonna in questa tabella da un modello utente?

Scusate se questo è fonte di confusione, si prega di avvisare su questo

risposta

12

Qui ci sono un paio di tutorial che dovrebbero aiutare. Fondamentalmente ci sono due approcci per fare il lavoro molti-a-molti, o has_and_belongs_to_many o has_many: through (consigliato).

link:

  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

Soprattutto il secondo collegamento. Un grande esempio di has_and_belongs_to_many in azione. –

+0

Questi link sono ancora rilevanti =? – shem

2

I [aggiunto] un'altra colonna di [users_groups] ... La domanda è: come ho accesso da un modello senza utilizzare un SQL personalizzato c tutti?

Sembra che si desidera accedere a una colonna della tabella user_groups chiamando un metodo del modello User o il vostro modello di Group.

Alcuni suggerimenti:

avrei il nome della tabella "user_groups" per lavorare con le aspettative di pluralizzazione di ActiveRecord, ma non sono sicuro se questo è essenziale.

Seguendo il consiglio di Dave, che ci si vuole impostare le cose con la tecnica del "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 

C'è un modo per cambiare la terza colonna in questa tabella da un modello di utente ?

Questo è un po 'poco chiaro, ma di tenere presente che ogni User può avere un sacco di UserGroups. Quindi, se volessi cambiare la terza colonna, dovresti trovare quella che stai cercando.

+0

Se non hai bisogno di dati aggiuntivi nella tabella UserGroup, salta completamente il suo ActiveRecord e usa le associazioni 'has_and_belongs_to_many' tra Utente e Gruppo con una tabella di join. Vedi il secondo link sull'altra risposta. –

+0

in django, è facile aggiungere una terza colonna a una tabella helper da molti a molti: basta aggiungere il campo al modello a cui si accede anche da "attraverso". Un'altra colonna nel tuo esempio è utile se si e. g. vuoi dare all'utente un certo stato (attivo o meno) nel gruppo. – Timo

7

In Rails 3 si desidera creare una tabella di unione per molte o più relazioni, utilizzando i nomi plurali delle tabelle a cui si desidera unire in ordine alfabetico. Quindi in questo caso sarebbe groups_users.

modelli

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

Sarebbe interessante sapere come accedere a un campo correlato in vista – Timo