これには2つの解決策を提案します
- 単純
最初にbalance
ユーザー モデルに列を追加し、トランザクション モデル内にコールバックを追加して、トランザクション タイプに基づいてユーザーの残高を更新します。
- 複雑
あなたも必要だと思うならdeposit_amount
、purchase amount
それ以上の時間を無駄にすることなく、counter_culture
ここで必要なものです.
counter_culture
Rails の counter_cache に多少似ていますが、さまざまなカスタマイズを行うことができます。
これには、次の変更が含まれます。
Gemfile に counter_culture を追加します。
gem 'counter_culture', '~> 0.1.33'
それからするbundle install
deposit_amount
列をテーブル
に追加purchase_amount
します。users
class AddDepositAmountPurchaseAmountToUsers < ActiveRecord::Migration
def self.change
add_column :users, :deposit_amount, :decimal, :default => 0
add_column :users, :purchase_amount, :decimal, :default => 0
終わり
終わり
それからするrake db:migrate
コードに適切な変更を加える
インサイド トランザクション モデル
counter_culture :user,
column_name: Proc.new {|model|
(model.txn_type == Transaction::DEPOSIT) ? 'deposit_amount' : 'purchase_amount' },
delta_column: :amount
ユーザーモデルの内部
def balance
@balance ||= deposit_amount - purchase_amount
end
カウンターカルチャーについてもっと知りたい方はこちらをお読みください