0

我有许多物品和付款的发票。

这是我的发票模型(至少是其中的一部分):

def total
  items.sum { |item| item.total }
end

def balance
  self.payments.sum(:amount) - self.total
end

现在在付款视图中,我试图找到余额小于 0 的所有发票:

<%= f.select(:invoice_id, current_user.invoices.where("balance > ?", 0)) %>

这当然行不通,因为balance不是一列。但是我怎样才能在那里插入一个方法呢?

谢谢你的帮助。

4

1 回答 1

1

你有几个选择。您总是可以创建balance一个列(在添加付款或项目时适当地更新它),这将允许您有效地执行此类查询。

但是,您可以只使用简单的 Ruby 方法 - 特别是Array#select. 就像是

current_user.invoices.to_a.select {|invoice| invoice.balance < 0}

会把你带到那里。但是,如果用户有大量发票,则效率不会很高。

更新:此外,如果您这样做,您将遇到N+1 查询情况,因为每张发票都需要从数据库中检索其项目和付款。为避免这种情况,您需要在原始查询中包含项目和付款,如下所示:

current_user.invoices.includes(:items, :payments).to_a.select{ ... }
于 2012-09-27T12:59:26.343 回答