2

現在、ユーザーの残高を計算しています

   def balance
      transactions.where('txn_type = ?', Transaction::DEPOSIT).sum(:amount) -    
      transactions.where('txn_type = ?', Transaction::PURCHASE).sum(:amount)
   end

すべてのユーザーの預金を差し引き、すべての購入を差し引くクエリを実行しています。何千ものトランザクションがある場合、これはうまくスケーリングしません。ユーザーの残高を計算する最良の方法は何ですか? ユーザーごとにこれを計算するように counter_cache をカスタマイズする方法はありますか?

4

2 に答える 2

2

:counter_sqlはい、の設定に使用するものを指定できますcounter_cache

Rails ガイドでは、それについて詳しく説明しています。

于 2012-04-30T21:30:31.227 に答える
0

これには2つの解決策を提案します

  1. 単純

最初にbalanceユーザー モデルに列を追加し、トランザクション モデル内にコールバックを追加して、トランザクション タイプに基づいてユーザーの残高を更新します。

  1. 複雑

あなたも必要だと思うならdeposit_amountpurchase amountそれ以上の時間を無駄にすることなく、counter_cultureここで必要なものです.

counter_cultureRails の counter_cache に多少似ていますが、さまざまなカスタマイズを行うことができます。

これには、次の変更が含まれます。

  1. Gemfile に counter_culture を追加します。

    gem 'counter_culture', '~> 0.1.33'

それからするbundle install

  1. 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

  2. コードに適切な変更を加える

インサイド トランザクション モデル

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

カウンターカルチャーについてもっと知りたい方はこちらをお読みください

于 2015-12-08T11:33:26.917 に答える