ActiveRecord:对等模型

Posted

技术标签:

【中文标题】ActiveRecord:对等模型【英文标题】:ActiveRecord: peer models 【发布时间】: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!

【问题讨论】:

【参考方案1】:

代金券有借记和贷记条目。凭证还需要验证借方和贷方的总和是否相等。凭证模型封装了净交易。事实上,您的 2 笔交易必须通过(内部)通过 Voucher (TransactionSet) 模型本身构建。

我正在与您分享这个,因为我自己正在构建一个簿记/会计系统。

您可以传递标志以防止在某些交易对落在系统之外的情况下不启动平衡验证。

在现实世界中,这种配对可以在多个交易条目之间进行。例如,一个借记对与 2 个贷记。

如果我假设太多,我知道您的问题更具技术性和道歉,但您确实需要围绕您确定为 TransactionSet 而不是您所谓的 icky 解决方案来建模您的解决方案。

【讨论】:

以上是关于ActiveRecord:对等模型的主要内容,如果未能解决你的问题,请参考以下文章

Rails Activerecord 通过三个关联查询?

Rails 中的表关联 - ActiveRecord

小程序授权登陆获取信息

yii2之ActiveRecord 模型

如何将 ActiveRecord 模型数组转换为 CSV?

Your Trial period has expired. To continue using ActiveReports 10, contact GrapeCity at ActiveRe