2012-04-20 30 views
8

Im có một chút vấn đề thiết lập một Rails has_many: thông qua: mối quan hệ đa hình.Đặt tên cho một Rails has_many: thông qua: mối quan hệ đa hình

Tôi biết chủ đề này là welldocumented trên SO nhưng tôi nghĩ rằng vấn đề của tôi là xuống mô hình của tôi và tên nước ngoài trái ngược với cú pháp tức là tôi nghĩ rằng đây là một "tôi đã nhìn vào mã quá dài" vấn đề chỉ cần một bộ mắt khác.

Dù sao tôi có các thiết lập sau:

class Milestone < ActiveRecord::Base 
    has_many :responsible_items, :as => :responsibility 
    has_many :responsible, :through => :responsible_items 
end 

class ResponsibleItem < ActiveRecord::Base 
    belongs_to :responsible, :class_name => "User" 
    belongs_to :responsibility, :polymorphic => true 
end 

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :responsibilities, :through => :responsible_items 
end 

Điều này dường như làm việc tốt, mà không có lỗi, từ phía Milestone của sự vật. Ví dụ: trong thiết bị đầu cuối tôi có thể viết:

Milestone.first.responsible 

... và nhận bộ sưu tập trống như tôi mong đợi.

Tuy nhiên, từ phía bên tài của sự vật, chạy:

User.first.responsibilities 

... được trả lại một lỗi AR:

ActiveRecord::HasManyThroughAssociationPolymorphicSourceError: Cannot have a has_many :through association 'User#responsibilities' on the polymorphic object 'Responsibility#responsibility'. 

Tôi giả định vấn đề này là một cái gì đó để làm với thực tế là tôi đang đề cập đến mối quan hệ Người dùng là: trách nhiệm. Thê nay đung không?

Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao, cảm ơn.

+1

các mô hình ở phía bên kia của mối quan hệ đa hình là gì? nó chỉ là sự kiện quan trọng hay bất kỳ mô hình nào khác? và khi bạn đang làm User.first.responsibilities bạn đang mong đợi để có được các đối tượng Milestone? thuộc về: trách nhiệm,: polymorphic => true – Abid

+0

Sẽ có các mô hình khác trong mối quan hệ đa hình nhưng Milestone là người duy nhất tôi đã xây dựng cho đến nay. Khi tôi làm 'User.first.responsibilities' tôi đang chờ các đối tượng Milestone có. – Pete

+1

Ah ok @Abid bạn đã khiến tôi suy nghĩ về câu hỏi của bạn. Tôi tự nhiên sẽ không thể rút ra một tập hợp các 'trách nhiệm' thông qua mối quan hệ đa hình vì chúng đều thuộc về các đối tượng khác nhau. Kết quả là tôi phải cụ thể hơn về Mô hình người dùng và nêu rõ những trách nhiệm nào tôi muốn có nghĩa là: 'has_many: milestone_responsibilities,: through =>: responsibility_items,: source =>: responsibility,: source_type => 'Milestone'' – Pete

Trả lời

11

Nhờ nhận xét của @ Abid tôi đã suy nghĩ về hậu cần kéo trong tất cả responsibilities cho người dùng, điều này sẽ không khả thi. Tôi cần phải được cụ thể hơn về những gì tôi muốn từ mối quan hệ và kết quả xác định các hoạt động sau đây:

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone' 
end 

tôi sau đó có thể mở rộng này như tôi thêm các mối quan hệ đa hình sâu hơn về các mô hình khác ví dụ:

class User < ActiveRecord::Base 
    has_many :responsible_items, :foreign_key => :responsible_id 
    has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone' 
    has_many :task_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Task' 
end 
+1

chính xác là là điểm của tôi về việc đặt câu hỏi để bạn có thể tìm ra những gì bạn đang làm là thiếu cái gì đó :) – Abid

+0

Cảm ơn! Điều này đã giúp tôi! :) – ZedTuX

+0

Wow, đây chỉ là những gì tôi đang tìm kiếm! "source_type" đã lưu ngày cho tôi. –

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