7

我在這裏冒着手掌到額頭的風險,但我無法完全弄清楚如何用Rails的ActiveRecord糖做到這一點。如何讓一個表中的兩列與ActiveRecord中的另一列指向另一列中的同一列?

我有一個具有兩列(submitter_idassignee_id)應每個參考從users表(特別是在usersid列)不同的用戶一個tickets表。我希望能夠使用ActiveRecord的關聯功能執行諸如ticket.submitter.nameticket.assignee.email之類的操作。提交者和受讓人只是不同關聯名稱下的用戶對象。

我發現接近我所做的唯一的事情就是使用多態關聯,但最終我確信它並不是我真正需要的東西。我不會有多種類型,提交者和受讓人都是用戶,很可能是兩個不同的用戶。

任何幫助將是太棒了。謝謝!

回答

14
class Ticket < ActiveRecord::Base 
    belongs_to :submitter, :class_name => "User" 
    belongs_to :assignee, :class_name => "User" 
end 

建議立即進行刪除工作。

編輯:沒有試用它,我不確定你是否需要:foreign_key參數。我的直覺不是,但它不會傷害。

再次編輯:對不起,離開了用戶 - >票務協會。您沒有提及使用它們,如果我不打算在另一個方向使用它們,我通常只會在一個方向上添加關聯。

無論如何,嘗試:

class User < ActiveRecord::Base 
    has_many :assigned_tickets, :class_name => "Ticket", :foreign_key => "assignee_id" 
    has_many :submitted_tickets, :class_name => "Ticket", :foreign_key => "submitter_id" 
end 
+0

絕對是一個手掌到額頭的時刻。我知道它在那裏,但我不能訪問那一點的內存。感謝您在這裏幫助我! – localshred

+0

這個答案節省了我們很多時間,_謝謝你。 – potashin

5

像這樣的東西應該工作

class Ticket < ActiveRecord::Base 
    belongs_to :submitter, :class_name => 'User', :foreign_key => 'submitter_id' 
    belongs_to :assignee, :class_name => 'User', :foreign_key => 'assignee_id' 
end 

class User < ActiveRecord::Base 
    has_many :tickets, :class_name => 'Ticket', :foreign_key => 'submitter_id' 
    has_many :tickets_assigned, :class_name => 'Ticket', :foreign_key => 'assignee_id' 
end 

是,PreciousBodilyFluids是正確的,我們並不需要在票務類指定foreign_key鐵軌從列名,即submitter_id推斷它和assignee_id

但是如果你的公會的名字是從column_name_ {ID}不同的,那麼你將有指定,即User類案件

+0

外鍵是在belongs_to的聲明不必要的,如果它可以從關聯的名稱派生。 – EmFi

+0

你是對的,這就是爲什麼我在我的回覆中提到它:) – nas

相關問題