2012-04-20 95 views
8

我有一個問題設置Rails has_many:through:polymorphic關係。Rails的命名has_many:通過:多態關係

我知道這個問題是welldocumented對所以但我認爲我的問題是我的模型和foreign_key名稱,而不是語法,即我認爲這是「我一直在看代碼太長」的問題那隻需要另一雙眼睛。

反正我有以下設置:

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 

這似乎很好地工作,沒有錯誤,從事物的里程碑側。例如在終端我可以寫:

Milestone.first.responsible 

...並得到我期望的空集合。

然而,從事物的用戶側,在運行:

User.first.responsibilities 

...是返回一個錯誤AR:

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

我假設的問題是什麼做的事實,我將用戶關係稱爲:負責任。這是正確的嗎?

任何幫助將不勝感激,謝謝。

+1

多態關係的另一面是什麼模型?它只是里程碑還是其他任何模型?當你在做User.first.responsibilities時,你是否期望獲得Milestone對象? belongs_to:responsibility::polymorphic => true – Abid 2012-04-20 16:03:26

+0

多態關係中還會有其他模型,但Milestone是迄今爲止我唯一建立的模型。當我做'User.first.responsibilities'時,我期待里程碑對象是。 – Pete 2012-04-20 16:07:29

+1

啊好吧@你讓我想你的問題。我自然無法通過:多態關係拉出「職責」集合,因爲它們都屬於不同的對象。因此,我必須對用戶模型進行更具體的說明,並說明我需要的職責,即'has_many:milestone_responsibilities,:through =>:responsible_items,:source =>:responsibility,:source_type =>'Milestone'' – Pete 2012-04-20 16:18:21

回答

11

感謝@ Abid的評論,我想到了爲用戶提供全部responsibilities的物流服務,這是不可行的。我需要的是更具體的瞭解我從關係想和結果定義以下工作:

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 

我可以再延長這是我在其他車型進一步增加多態關係,例如:

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

是我問這個問題的重點,所以你可以找出你在做什麼是缺少的東西:) – Abid 2012-04-20 19:59:50

+0

謝謝!這幫助了我! :) – ZedTuX 2013-11-10 11:49:00

+0

哇,這正是我正在尋找的! 「source_type」爲我節省了一天的時間。 – 2014-01-27 08:39:58