【发布时间】:2011-02-18 11:57:48
【问题描述】:
将模型作为对等体关联的最佳方式是什么?
以经典的银行业务为例
class Transaction < AR::Base
belongs_to :account
# attribute: amount decimal
end
class Account < AR::Base
has_many :transactions
# attribute name string
end
# move money like this:
t1 = Transaction.create(:amount=>10, :account=>Account.find_by_name('Mine'))
t2 = Transaction.create(:amount=>-10, :account=>Account.find_by_name('Yours'))
我想将两笔交易关联起来,这样我就可以从特定的存款转到与之相反的确切取款。
我可以将它添加到 Transaction 模型中:
belongs_to :mirror_transaction, :class_name=>'Transaction'
has_one :other_transaction, :class_name=>'Transaction', :foreign_key=>'mirror_transaction_id'
...但感觉有点恶心。没有比这更好的表达方式了!
我能想到的唯一其他方法是创建第三个包装模型,例如:
class TransactionSet < AR::Base
has_many :transactions
end
请注意,我不能简单地将我的交易模型扩展为与两个帐户相关联。一些付款“在系统之外”,即它们不会配对。此外,在我遇到的实际问题中,模型要复杂得多,我不想将所有内容都加倍。
有什么建议或其他想法吗?
TIA!
【问题讨论】:
标签: ruby activerecord data-modeling