2013-04-01 5 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 ссылаться на родителя.