状況
だからここに私の状況の簡略化されたバージョンがあります:
支払いモデルがあります。次の属性があります。
- 支払金額
- 支払期日
トランザクションモデルがあります。次の属性があります。
- トランザクションの説明
- 取引金額
- 支払い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