我的代码存在一些问题。这可能是由于某些设计错误造成的。我尝试过几件事。这是两个。
问题:我有一个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项目,但没有一个解决了类似的问题,因此我认为这是一个设计问题。
答案 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