14

Để biểu thị rằng một nhóm có thể có nhiều người dùng và người dùng có thể thuộc nhiều nhóm , tôi đặt công ty sau đây:Đường ray: Tại sao kết quả liên kết "has_many ...,: through => ..." trong "NameError: uninitialized constant ..."

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 

Tuy nhiên, khi tôi gõ:

Group.find(1).users 

tôi nhận được:

NameError: uninitialized constant Group::UsersGroup 

tôi đang làm gì sai rồi ?

Trả lời

29

class UsersGroups phải là class UsersGroup. Các mô hình ActiveRecord là số ít - các bảng số nhiều.

+0

Cảm ơn! Nó chỉ trông lạ/sai với tôi để có một mô hình gọi là 'UsersGroup'. Tôi không muốn một người trong số họ trở nên số nhiều và số ít khác. Có lẽ tôi nên đổi tên mô hình thành một cái gì đó như UserGroupPair, để tên bảng sẽ là 'user_group_pairs'. Bạn nghĩ sao ? –

+1

Khi bạn có mô hình tham gia, thực hành tiêu chuẩn là đưa ra một từ mô tả liên kết. Ví dụ, GroupMembership hoặc một cái gì đó. Chỉ cần kiểm tra, bạn có chắc bạn cần một mô hình tham gia? Bạn có thể lấy đi chỉ với một bảng nếu tham gia không cần logic. – Skilldrick

+0

Bạn có phải là tên mẫu 'GroupMembership' và tên bảng' group_membership', tức là cả hai số ít? Tôi không chắc tôi đã hiểu điểm thứ hai của bạn về việc loại bỏ bảng tham gia. Bạn có thể xây dựng một chút không? –

1

ActiveRecord cố gắng để làm nổi bật tên, nhưng lớp học của bạn thực sự có tên là UserGroups. Đổi tên thành UserGroup. Các mô hình là số ít.

1

tôi nghĩ tên thay đổi của lớp Nhóm người dùng thành Nhóm người dùng

-1

Ngoài ra, hãy lưu ý rằng tên tệp của mô hình cũng phải ở dạng số ít. Trong trường hợp này, app/models/user_group.rb

+1

Không phải lúc nào. Trong trường hợp đặc biệt này thì được rồi. –

Các vấn đề liên quan