0

情况

所以这是我的情况的简化版本:

我有一个付款模式。它具有以下属性:

  • 支付金额
  • 付款日期

我有一个交易模型。它具有以下属性:

  • 交易说明
  • 交易金额
  • 付款编号

笔记:

  • 一次支付可以应用于多个交易(即一次支付has_many交易)。
  • 可以通过将属于付款的每笔交易的交易金额相加来计算付款的余额。

我目前正在使用 SQL join、group 和 sum 聚合函数计算剩余余额。我在我的付款模型中添加了一个范围来执行此操作:

scope :all_with_balances, 
  select("payments.*, (payments.payment_amount - sum(transactions.transaction_amount) as remaining_balance").
  joins("LEFT JOIN transactions ON payments.id = transactions.payment_id").
  group(<list of payments columns>)

此处要注意的重要一点是remaining_balance此查询返回的附加列,其计算方式如下:(payments.payment_amount - sum(transactions.transaction_amount) as remaining_balance.

问题

使用这个范围,支付模型被实例化/初始化,所有属性都映射到实际的数据库列。但是,我也希望它们被初始化为remaining_balance. 这可能吗?

我以为我可以为此列定义一个访问器,但它不起作用。

attr_accessor :remaining_balance
4

1 回答 1

1

当您调用命名范围时,ActiveRecord 应将所有列的属性(包括计算的列)附加到结果集中的支付实例:

payments = Payment.all_with_balances
balance = payments.first.remaining_balance # should be the value of the aggregate column

这不工作吗?

于 2010-11-01T18:55:32.857 回答