如何使用ActiveRecord关联获取最近的单个项目?

时间:2009-09-02 12:24:34

标签: ruby-on-rails ruby design-patterns activerecord

我的代码存在一些问题。这可能是由于某些设计错误造成的。我尝试过几件事。这是两个。

问题:我有一个1 (lending) - N (contracts)关系。我想打电话给lending.current_contract,这将返回最后一份相关合同。 优化也是一个问题。我想调用:lending, :include => :contracts,而不必对已包含所有合同的合同数组中的合同使用单独的查询。

糟糕的解决方案1:

has_one :current_contract, :class_name => "Contract"

这不起作用,因为每次我创建,更新或销毁它都必须更新父贷款。这样做我得到一个回调混乱。例如,在创建贷款时,它还会创建第一个合同。出于某种原因,使用回调来回交换贷款,因为它的合同不起作用。

糟糕的解决方案2:

def current_contract
  return if contracts.relevant.empty?
  @current_contract = contracts.relevant.last
end

发送副本而不是参考。所以lending.current_contract.status = value不起作用。

我应该看一些设计模式吗?还有一些例子吗?我看了一些github项目,但没有一个解决了类似的问题,因此我认为这是一个设计问题。

2 个答案:

答案 0 :(得分:3)

关联通常可以采用:conditions哈希,这可能很方便。 (直到我半小时前才需要它,我才忘记这一点。)

会有帮助吗?类似的东西:

has_one :current_contract, :class_name => "Contract", :conditions => ...

更多地看the book(确切地说,第364页):

has_one :current_contract, :class_name => "Contract", :order => 'created_at DESC'

...将引用最近创建的合同。当然,您可能有更合适的专栏。

我希望我早些时候见过 - 我现在需要改变一些代码......

答案 1 :(得分:0)

“相关”,你的意思是最近的吗?

class Lending < ActiveRecord::Base
  has_many :contract
  attr_reader :current_contract

  def initialize
   @current_contract = Contract.New
  end
  ...
end

class Contract < ActiveRecord::Base
  has_one :lending
  ...

  def before_delete
    # update lending to the most relevant contract
    # if this is the current_contract for parent lending
  end
end