轨道控制器过滤方法

时间:2017-05-18 21:53:52

标签: ruby-on-rails activerecord

如何使客户/索引仅显示负余额的客户?

我有 Client.rb

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

ClientsController.rb:

LetterColumn

考虑到,&#34;平衡&#34;未保存为数据库中表的列...

2 个答案:

答案 0 :(得分:2)

您可以使用Enumerable#select过滤Ruby:

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的聚合,并在数据库级别进行计算。

答案 1 :(得分:1)

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

加入两个模型并在查询时应用条件,如上所述。这会快得多。