14

Aby wyrazić, że grupa może mieć wielu użytkowników, a użytkownik może należeć do wielu grup , ustawić następujące skojarzenia:Szyny: Dlaczego skojarzenie "has_many ...,: through => ..." powoduje "NameError: stała niezainicjowana ..."

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 

jednak, gdy wpisuję:

Group.find(1).users 

uzyskać:

NameError: uninitialized constant Group::UsersGroup 

Co robię źle ?

Odpowiedz

29

powinien być class UsersGroup. Modele ActiveRecord są pojedyncze - tabele są w liczbie mnogiej.

+0

Dzięki! Po prostu wygląda na to, że mam dziwny/zły model o nazwie 'UsersGroup'. Nie chcę, aby jeden z nich był liczbą mnogą, a drugi liczbą pojedynczą. Może powinienem zmienić nazwę modelu na coś podobnego do UserGroupPair, aby nazwa tabeli brzmiała "user_group_pairs". Co myślisz ? –

+1

Jeśli masz model łączenia, standardową praktyką jest wymyślanie słowa opisującego powiązanie. Na przykład GroupMembership lub coś takiego. Aby to sprawdzić, czy na pewno potrzebujesz modelu łączenia? Możesz uzyskać tylko stolik, jeśli sprzężenie nie wymaga logiki. – Skilldrick

+0

Masz na myśli nazwę modelu 'GroupMembership' i nazwę tabeli' group_membership', tj. Obie liczby pojedyncze? Nie jestem pewien, czy zrozumiałem twój drugi punkt dotyczący pozbycia się stołu do łączenia. Czy mógłbyś trochę rozwinąć? –

1

ActiveRecord próbuje pojedynczej nazwy, ale twoja klasa jest rzeczywiście o nazwie UserGroups. Zmień nazwę na UserGroup. Modele są pojedyncze.

1

myślę nazwa Grupy zmiana klasy na grupy użytkowników

-1

Ponadto, należy pamiętać, że nazwa pliku modelu musi być również w formie liczby pojedynczej. W tym przypadku, app/models/user_group.rb

+1

Nie zawsze. W tym konkretnym przypadku jest OK. –

Powiązane problemy