2017-05-18 3 views
1

クライアント/インデックス表示クライアントのみを負の残高にするにはどうすればよいですか?レールコントローラのフィルタ方法

has_many :incomes 
has_many :expences 

    def all_incomes 
     incomes.map(&:amount).sum 
    end 
    def all_expences 
     expences.map(&:amount).sum 
    end 
    def balance 
    all_incomes - all_expences 
    end 
end 

ClientsController.rb:

def index 
    @client = Client.where(:balance < 0) 
    end 

"バランス" テーブルの列のように保存されていないことを、考慮する

私はClient.rbを持っていますデータベース...

+0

もちろん、残高がデータベースに保存されていればうまくいきましたが、そうではありませんでした。それはモデルで計算されたフィールドです... –

答えて

2

をルビーでフィルタリングすることができます:

class Client 
    def all_incomes 
    incomes.map(&:amount).sum 
    end 
    def all_expences 
    expences.map(&:amount).sum 
    end 
    def balance 
    all_incomes - all_expences 
    end 

    def self.postive_balance 
    self.all.select {|c| c.balance < 0 } 
    end 
end 

ただし、十分な量のクライアントがあれば非常に効率が悪くなります。代わりに、incomes.amountexpenses.amountの集計を選択し、データベースレベルで計算を実行する必要があります。 how to calculate balances in an accounting software using postgres window function

1
def index 
    @client = Client.joins(:incomes,:expenses).having("SUM(incomes.amount) - SUM(expenses.amount) < 0") 
    end 

両方のモデルと結合し、上記のように照会しながら、条件を適用します。これははるかに高速になります。

関連する問題