0

状況

だからここに私の状況の簡略化されたバージョンがあります:

支払いモデルがあります。次の属性があります。

  • 支払金額
  • 支払期日

トランザクションモデルがあります。次の属性があります。

  • トランザクションの説明
  • 取引金額
  • 支払いID

ノート:

  • 支払いは、複数のトランザクション(つまり、支払いhas_manyトランザクション)に適用できます。
  • 支払いの残りの残高は、支払いに属する各トランザクションのトランザクション金額を合計することによって計算できます。

現在、SQL結合、グループ、および合計集計関数を使用して残りの残高を計算しています。これを行うために、支払いモデルにスコープを追加しました。

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 に答える