【问题标题】:Referencing calling instance variable when extending has_many扩展 has_many 时引用调用实例变量
【发布时间】:2013-04-01 17:38:42
【问题描述】:

我有一个名为 Project 的模型,它有很多 Proposals.

项目模型有一个名为winning_proposal_id的属性

现在我有这样的东西来找到获胜的提案以及一个 has_many 的提案:

belongs_to :winning_proposal, :class_name => "Proposal", :foreign_key => "winning_proposal_id"
has_many :proposals, dependent: :destroy 

我做的:

@project.winning_proposal

参考获胜的提案,但我不是这个的粉丝。

我希望是这样的:

@project.proposals.winner

我认为它更干净。但是,要做到这一点,我需要能够从块中引用实例变量 wins_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

但这似乎很笨拙。任何人都知道如何从块中引用调用实例变量?

【问题讨论】:

  • 有趣。这可能是口味问题,但我更喜欢@project.winning_proposal 方式。它具有遵循得墨忒耳法则en.wikipedia.org/wiki/Law_of_Demeter 的额外优势
  • 是的。我只是找到这个清洁剂。使执行 project.proposals.winner 和 project.proposals.loser 之类的事情变得更容易`

标签: ruby-on-rails has-many model-associations rails-models


【解决方案1】:

为其他感兴趣的人想办法:

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

关键是使用proxy_association.owner来引用父级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多