12

Tôi có một mô hình User có nhiều kiểu projectsProject mô hình có thể có nhiều users, nhưng cũng thuộc về một người dùng (tức là người dùng đã tạo dự án này). Nó phải thuộc về một User. Nó cũng cho phép một danh sách người dùng được liên kết với nó, nghĩ rằng sự cộng tác.Rails có nhiều và thuộc về một

Với điều này trong tâm trí, mô hình của tôi trông như thế này:

class User < ActiveRecord::Base 
    has_many :assigned_projects 
    has_many :projects, :through => :assigned_projects 
end 

class Project < ActiveRecord::Base 
    belongs_to :user 
    has_many :assigned_projects 
    has_many :users, :through => :assigned_projects 
end 

class AssignedProject < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :project 
end 

Bây giờ, khi tôi muốn tạo một dự án mới thông qua một User, đây là cách tôi sẽ làm điều đó:

user = User.create(:name => 'injekt') 
user.projects.create(:name => 'project one') 

Bây giờ, tôi biết rằng projects được cung cấp thông qua mô hình tham gia AssignedProject, đó là lý do tại sao project.user sẽ trả lại nil. Những gì tôi đang cố gắng để có được đầu của tôi là cách tốt nhất để chỉ định người tạo dự án (theo cách này không phải là cầnuser, có thể là creator hoặc mô tả khác, miễn là loại User).

Ý tưởng sau đó là tạo phương thức trả lại projects_created từ số User sẽ chỉ chọn dự án được tạo bởi người dùng này. Trường hợp user.projects tất nhiên sẽ trả về TẤT CẢ các dự án mà người dùng được liên kết.

Giả sử loại liên kết này là khá phổ biến, cách tốt nhất để đạt được những gì tôi muốn là gì? Bất kỳ hướng nào được đánh giá cao.

Trả lời

20

Thêm một cột creator_id để bàn dự án của bạn cho mối quan hệ tác giả, và sau đó thêm các hiệp hội để các mô hình:

class User < ActiveRecord::Base 
    has_many :assigned_projects 
    has_many :projects, :through => :assigned_projects 

    has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id 
end 

class Project < ActiveRecord::Base 
    belongs_to :user 
    has_many :assigned_projects 
    has_many :users, :through => :assigned_projects 

    belongs_to :creator, :class_name => "User", :foreign_key => :creator_id 
end 

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

+0

Cảm ơn câu trả lời của bạn, đây không phải là vấn đề của tôi. Đó là: * Những gì tôi đang cố gắng để có được đầu của tôi là cách tốt nhất để chỉ định người sáng tạo dự án (mà theo cách này không cần phải là người dùng, nó có thể là người sáng tạo hoặc mô tả khác, miễn là thuộc loại Người dùng). * –

+0

@Nuby chắc chắn về điều gì? Chắc chắn rằng tôi đang cố gắng để có được đầu của tôi xung quanh giao người dùng/người sáng tạo cho dự án một cách tự động? yes –

+0

Trừ khi tôi đọc nhầm câu trả lời của @ Pavling (và câu hỏi của bạn), những gì anh ấy đề xuất là bạn tạo mối quan hệ thứ hai với bảng Người dùng, được gọi là 'Người sáng tạo'. Sau đó bạn có thể gọi 'Project.creator' để có được người dùng liên quan từ hiệp hội' CreatedProjects'. Điều đó sẽ giải quyết (tôi nghĩ) vấn đề của bạn. Theo như cách gán nó, bạn có thể làm một hook 'before_create' trong mô hình để gán nó cho người dùng hiện đang đăng nhập, hoặc một người dùng khác (tùy thuộc vào logic của dự án của bạn). – Nuby

1

tôi muốn thêm chút cải tiến để thiết kế. Chúng tôi không thực sự cần mô hình trung gian vì nó không chứa bất kỳ cột phụ nào khác ngoài tham chiếu do đó hiệp hội HABTM phù hợp nhất ở đây.

class User < ActiveRecord::Base 
    has_and_belongs_to_many :projects, :join_table => :assigned_projects 
    has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id 
end 

class Project < ActiveRecord::Base 
    has_and_belongs_to_many :users, :join_table => :assigned_projects 
    belongs_to :creator, :class_name => "User", :foreign_key => :creator_id 
end 
+0

Thật sao? Bạn không quan tâm vai trò người dùng được gán cho một dự án cụ thể hoặc ngày chuyển nhượng của họ là gì hoặc bất kỳ thông tin nào khác có liên quan đến sự tham gia của người dùng đó vào dự án cụ thể đó? Bạn sẽ được tái cấu trúc rằng HABTM ra HMT trước khi kết thúc tháng ;-) – Pavling

+0

@Chuyển những gì người dùng 'vai trò' bạn đang nói về? tôi không nhận được bạn về điều này. Có nhu cầu về ngày mà nhiệm vụ dự án đã được thực hiện? Nếu các cột thừa sẽ có thì sau đó 'has_many through' có thể là lựa chọn tốt. –

+1

Trên một dự án, người dùng có thể đảm nhận vai trò của Trưởng nhóm kỹ thuật, mặt khác, cô có thể là Người kiểm tra giao diện người dùng. Bạn có thể không muốn thông tin cụ thể này (hoặc ngày chuyển nhượng) - đó chỉ là một ví dụ; nhưng bạn * sẽ * muốn biết thêm thông tin hơn là chỉ * người * đang ở trong một dự án. Chắc chắn, mối quan hệ kiểu HABTM có vị trí của họ, nhưng thực sự, * cái này * sẽ là một HMT. – Pavling

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