2013-04-01 31 views
0

當調用實例變量我有一個叫Project模型有很多Proposals.引用延伸的has_many

項目模型有一個屬性,叫做winning_proposal_id

現在,我有這樣的事情找到了獲勝的提案,以及作爲提案的has_many:

從我做的:

@project.winning_proposal 

以引用獲勝的提案,但我並不是真正的粉絲。

我希望會是這樣的:

@project.proposals.winner 

,我認爲它只是清潔。要做到這一點,但是,我需要能夠引用從塊內winning_proposal_id實例變量:

has_many :proposals, dependent: :destroy do 
    def winner 
    self.where(id: winning_proposal_id).first 
    end 
end 

,但不起作用。我相信我可以這樣做:

has_many :proposals, dependent: :destroy do 
    def winner 
    self.where(id: self.project.first.winning_proposal_id).first 
    end 
end 

但這似乎是kludgy。任何人都知道如何從塊內引用調用實例變量?

+0

有趣。這可能是品味的問題,但我更喜歡@ project.winning_proposal方式。它具有遵循德米特法則的額外優勢http://en.wikipedia.org/wiki/Law_of_Demeter –

+0

正確。我只是找到這個清潔工。使得像project.proposals.winner和project.proposals.loser這樣的事情變得更容易 – JoshL

回答

0

想通了其他任何人感興趣的是:

has_many :proposals, dependent: :destroy do 
def winner 
    self.first(conditions: {id: proxy_association.owner.winning_proposal_id}) 
end 
end 

的關鍵是使用proxy_association.owner引用父。