2013-11-21 109 views
1

關聯的模型我有兩個型號選擇與外鍵

class Endorsement < ActiveRecord::Base 
    belongs_to :user, foreign_key: "endorser_id" 
    belongs_to :user, foreign_key: "endorsee_id" 
end 

class User < ActiveRecord::Base 
    # Contains a name attribute 

    has_many :endorsements, foreign_key: "endorser_id" 
    has_many :endorsements, foreign_key: "endorsee_id" 
end 

我想要得到的背書人名稱。當我做endorsement.user.name我收到endorsee_id的名字,當我真的想要endorser_id的名字。我如何在Rails中做到這一點?

回答

2
class Endorsement < ActiveRecord::Base 
    belongs_to :endorser, class_name: "User", foreign_key: "endorser_id" 
    belongs_to :endorsee, class_name: "User", foreign_key: "endorsee_id" 
end 

class User < ActiveRecord::Base 
    # Contains a name attribute 
    has_many :endorsements, foreign_key: "endorser_id" 
    has_many :endorsements, foreign_key: "endorsee_id" 
end 

endorsement.endorser.name 
+0

由於您是第一個回覆您獲得信貸。謝謝。 – jason328

+0

CDub的答案更好 - 用戶模型還包含需要更改的重複引用。 – AndyV

+1

@AndyV是的,但是想想OP在遇到下一個錯誤時所體驗到的快樂和自我滿足感,並發現他可以應用他的新發現的知識! –

2

你會要重命名的belongs_tohas_manyname部分是唯一的,則追加class_name:的關係,使得滑軌知道看哪個模型:

class Endorsement < ActiveRecord::Base 
    belongs_to :endorser, foreign_key: "endorser_id", class_name: "User" 
    belongs_to :endorsee, foreign_key: "endorsee_id", class_name: "User" 
end 

class User < ActiveRecord::Base 
    # Contains a name attribute 

    has_many :has_endorsed, foreign_key: "endorser_id", class_name: "Endorsement" 
    has_many :endorsements, foreign_key: "endorsee_id", class_name: "Endorsement" 
end 

這將使你需要做以下所有事情:

User.first.has_endorsed 
User.first.endorsements 
Endorsement.first.endorser 
Endorsement.first.endorsee 
+0

我喜歡在'has_many'方法中添加':has_endorsed'和':endorsements'參數的技巧。但是'class_name'不應該在用戶模型中引用'Endorsement'而不是'User'? – jason328

+0

你是正確的先生。複製/粘貼錯誤。 – CDub

0

這是因爲你正在覆蓋關係。您將需要使用class_name參數。像這樣的東西。

belongs_to :endorser, class_name: 'User', foreign_key: 'endorser_id' 
belongs_to :endorsee, class_name: 'User', foreign_key: 'endorsee_id' 

同樣適用於用戶模型。

has_many :endorsers, class_name: 'Endorsement', foreign_key: 'endorser_id' 
has_many :endorsees, class_name: 'Endorsement', foreign_key: 'endorsee_id'