2009-07-21 31 views
12

Tôi có hai kiểu, Người dùng và Nhóm. Mỗi nhóm có thể có nhiều người dùng và mỗi người dùng có thể có nhiều nhóm.Đường ray (ActiveRecord) nhiều đến nhiều bảng

Tôi hiện đang có một cái gì đó đơn giản như:

User:

has_many :groups 

Nhóm:

has_many :users 

Vì vậy, tôi có một bảng groups_users mà chỉ là tạo ra hàng với GROUP_ID và user_id. Tôi muốn thêm một cột khác vào điều này, (mà tôi có), câu hỏi là làm thế nào để truy cập nó từ một mô hình mà không cần sử dụng một cuộc gọi SQL tùy chỉnh? Trong mô hình nhóm, tôi có thể tự làm chủ và người dùng tôi có thể tự selfgroups

Có cách nào để thay đổi cột thứ ba trong bảng này từ mô hình người dùng không?

Xin lỗi nếu điều này gây nhầm lẫn, vui lòng thông báo trên

Trả lời

12

Đây là một số hướng dẫn sẽ hữu ích. Về cơ bản có hai cách tiếp cận để thực hiện nhiều công việc, hoặc has_and_belongs_to_many hoặc has_many: thông qua (được khuyến nghị).

liên kết:

  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

Đặc biệt là các liên kết thứ 2. Ví dụ tuyệt vời về has_and_belongs_to_many đang hoạt động. –

+0

Các liên kết đó vẫn có liên quan =? – shem

2

tôi [thêm] một cột tới [users_groups] ... Câu hỏi đặt ra là làm thế nào để tôi truy cập từ mô hình mà không cần sử dụng một SQL tùy chỉnh c tất cả các?

Có vẻ như bạn muốn truy cập vào một cột của bảng user_groups của bạn bằng cách gọi một phương thức trên User mô hình của bạn hoặc Group mô hình của bạn.

Một số gợi ý:

Tôi muốn đặt tên cho bảng "user_groups" để làm việc với những kỳ vọng pluralization ActiveRecord, nhưng tôi không chắc chắn nếu đó là điều cần thiết.

Tiếp theo lời khuyên của Dave, bạn muốn thiết lập những điều sử dụng "has_many :through" kỹ thuật ...

# 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ó cách nào để thay đổi cột thứ ba trong bảng này từ một mô hình người dùng ?

Đây là một chút không rõ ràng, nhưng hãy nhớ rằng mỗi User có thể có rất nhiều UserGroups. Vì vậy, nếu bạn muốn thay đổi cột thứ ba đó, bạn phải tìm một thứ cụ thể mà bạn đang tìm kiếm.

+0

Nếu bạn không cần thêm bất kỳ dữ liệu nào trong bảng UserGroup, hãy bỏ qua toàn bộ ActiveRecord của nó và sử dụng các liên kết 'has_and_belongs_to_many' giữa Người dùng và Nhóm với một bảng tham gia. Xem liên kết thứ hai trên câu trả lời khác. –

+0

trong django, thật dễ dàng để thêm cột thứ ba vào bảng nhiều người trợ giúp: bạn chỉ cần thêm trường vào mô hình mà bạn cũng truy cập bằng "thông qua". Một cột khác trong ví dụ của bạn là hữu ích nếu bạn e. g. muốn cung cấp cho người dùng trạng thái nhất định (hoạt động hoặc không) trong nhóm. – Timo

7

Trong Rails 3, bạn muốn tạo bảng kết nối cho nhiều mối quan hệ, sử dụng tên số nhiều của các bảng bạn muốn tham gia theo thứ tự bảng chữ cái. Vì vậy, trong trường hợp này, nó sẽ là groups_users.

mô hình

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

Sẽ rất thú vị khi biết cách truy cập một trường có liên quan trong chế độ xem – Timo

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