【问题标题】:rails controller filter on methodrails 控制器过滤方法
【发布时间】:2017-05-18 21:53:51
【问题描述】:

如何让客户/指数只显示负余额的客户?

我有 Client.rb

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

考虑到,“余额”没有保存为数据库中表的列...

【问题讨论】:

  • 当然,如果balance 保存在数据库中,它会起作用,但事实并非如此。它是一个字段,在模型中计算...

标签: ruby-on-rails activerecord


【解决方案1】:

您可以在 Ruby 中使用Enumerable#select 进行过滤:

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

【讨论】:

    【解决方案2】:
      def index
        @client = Client.joins(:incomes,:expenses).having("SUM(incomes.amount) - SUM(expenses.amount) < 0")
      end
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2023-03-17
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      相关资源
      最近更新 更多