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.

导轨指南详细介绍了它。

于 2012-04-30T21:30:31.227 回答
0

我会为此建议两种解决方案

  1. 简单的

首先balance在 User 模型中添加列,并在 Transaction 模型中添加回调,以根据交易类型更新用户的余额。

  1. 复杂的

如果您认为您也需要deposit_amount并且purchase amount不浪费更多时间,那么counter_culture这就是您所需要的。

counter_culture有点类似于 rails counter_cache 但允许我们进行各种自定义。

这将涉及以下更改:

  1. 将 counter_culture 添加到您的 Gemfile:

    gem 'counter_culture', '~> 0.1.33'

然后做bundle install

  1. 向表中添加列deposit_amount和。 purchase_amountusers

    类 AddDepositAmountPurchaseAmountToUsers < ActiveRecord::Migration
      定义自我改变
        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 回答