2009-07-21 23 views
12

Tengo dos modelos, usuarios y grupos. Cada grupo puede tener muchos usuarios y cada usuario puede estar en muchos grupos.Rails (ActiveRecord) many to many table

Actualmente tengo algo tan simple como:

usuario:

has_many :groups 

Grupo:

has_many :users 

así que tengo una tabla groups_users que se acaba de crear filas con group_id y user_id. Quiero agregar otra columna a esto, (que tengo), la pregunta es ¿cómo puedo acceder desde un modelo sin usar una llamada SQL personalizada? En el modelo de grupo puedo ir a self.users y en user puedo ir self.groups

¿Hay alguna manera de cambiar la tercera columna de esta tabla de un modelo de usuario?

Lo siento si esto es confuso, por favor aconsejarle en

Respuesta

12

Aquí hay un par de tutoriales que le ayudarán. Básicamente existen dos enfoques para hacer que funcione de muchos a muchos, ya sea has_and_belongs_to_many o has_many: through (recommended).

enlaces:

  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

Especialmente el segundo enlace. Gran ejemplo de has_and_belongs_to_many en acción. –

+0

¿Siguen siendo relevantes esos enlaces =? – shem

2

I [agregado] a otra columna [users_groups] ... La cuestión es cómo hacer que el acceso desde un modelo sin usar un SQL personalizado c ¿todas?

Parece que usted quiere acceder a una columna de la tabla user_groups llamando a un método del modelo de User o su modelo Group.

Algunas sugerencias:

me nombre a la tabla "user_groups" para trabajar con las expectativas de pluralización de ActiveRecord, pero no estoy seguro si eso es esencial.

Siguiendo el consejo de Dave, que te gustaría establecer las cosas mediante la técnica de "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 

¿Hay una manera de cambiar la tercera columna de esta tabla a partir de un modelo de usuario ?

Esto es un poco confuso, pero hay que tener en cuenta que cada User puede tener una gran cantidad de UserGroups. Entonces, si quisieras cambiar esa tercera columna, tendrías que encontrar la particular que estás buscando.

+0

Si no necesita datos adicionales en la tabla UserGroup, omita por completo su ActiveRecord y use las asociaciones 'has_and_belongs_to_ many' entre User y Group con una tabla de unión. Ver el segundo enlace en la otra respuesta. –

+0

en django, es fácil agregar una tercera columna a una tabla de ayuda muchos a muchos: simplemente agrega el campo al modelo al que también se accede mediante "a través". Otra columna en su ejemplo es útil si usted e. gramo. desea dar al usuario un cierto estado (activo o no) en el grupo. – Timo

7

En Rails 3 desea hacer una tabla de unión para muchas relaciones, usando los nombres en plural de las tablas que desea unir en orden alfabético. Entonces, en este caso sería groups_users.

modelos

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

Sería interesante saber cómo acceder a un campo relacionado a la vista – Timo

Cuestiones relacionadas