Rails通过方法与聚合关联范围

时间:2018-02-17 06:35:54

标签: ruby-on-rails postgresql activerecord

我试图检索依赖于他们的关联记录的关联记录'属性。以下是(删节)模型。

class Holding
  belongs_to :user
  has_many :transactions

  def amount
    transactions.reduce(0) { |m, t| t.buy? ? m + t.amount : m - t.amount }
  end

  class << self
    def without_empty
      includes(:transactions).select { |h| h.amount.positive? }
    end
end


class Transaction
  belongs_to :holding

  attributes :action, :amount

  def buy?
    action == ACTION_BUY
  end
end

问题是我的without_empty方法返回一个数组,这阻止我使用我的分页。

有没有办法重写Holding#amountHolding#without_empty以便使用ActiveRecord / SQL更有效地运行?

1 个答案:

答案 0 :(得分:0)

这是我最终使用的内容:

def amount
  transactions.sum("CASE WHEN action = '#{Transaction::ACTION_BUY}' THEN amount ELSE (amount * -1) END")END")
end


def without_empty
 joins(:transactions).group(:id).having("SUM(CASE WHEN transactions.action = '#{Transaction::ACTION_BUY}' THEN transactions.amount ELSE (transactions.amount * -1) END) > 0")
end