14

Para expresar que un grupo puede tener múltiples usuarios, y un usuario puede pertenecer a múltiples grupos , me puse las siguientes asociaciones:Rails: Por qué "has_muy ...,: a través => ..." resultados de asociación en "NameError: constante no inicializada ..."

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

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

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

Sin embargo, cuando escribo:

Group.find(1).users 

me sale:

NameError: uninitialized constant Group::UsersGroup 

¿Qué estoy haciendo incorrecto ?

Respuesta

29

class UsersGroups debería ser class UsersGroup. Los modelos de ActiveRecord son singulares: las tablas son plurales.

+0

Gracias! Me parece extraño/incorrecto tener un modelo llamado 'UsersGroup'. No quiero que uno de ellos sea plural y el otro singular. Tal vez debería cambiar el nombre del modelo a algo así como UserGroupPair, de modo que el nombre de la tabla sea 'user_group_pairs'. Qué piensas ? –

+1

Cuando tiene un modelo de unión, la práctica estándar es crear una palabra que describa la asociación. Por ejemplo, GroupMembership o algo así. Sin embargo, para comprobarlo, ¿está seguro de que necesita un modelo de unión? Puede salirse con una sola mesa si la unión no necesita lógica. – Skilldrick

+0

¿Quiere decir el nombre del modelo 'GroupMembership' y el nombre de la tabla' group_membership', es decir, ambos en singular? No estoy seguro de entender su segundo punto con respecto a deshacerse de la mesa de unión. Podrías elaborar un poco ? –

1

ActiveRecord intenta singularizar el nombre, pero su clase en realidad se llama UserGroups. Cambie el nombre a UserGroup. Los modelos son singulares

1

Creo que el nombre de Grupos de cambio de clase a grupos de usuarios

-1

Además, tenga en cuenta que el nombre de archivo del modelo también debe estar en la forma singular. En este caso, app/models/user_group.rb

+1

No siempre. En este caso particular, está bien. –

Cuestiones relacionadas