我有很多物品和付款的发票。
这是我的发票模型(至少是其中的一部分):
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 不是一列。但是我怎么能在那里插入一个方法呢?
感谢您的帮助。
答案 0 :(得分:1)
你有几个选择。您可以始终将balance
作为列(在添加付款或项目时适当更新),这样您就可以有效地执行此类查询。
Array#select
。像这样的东西
current_user.invoices.to_a.select {|invoice| invoice.balance < 0}
会帮你到那儿。如果用户有大量发票,那就不会非常有效。
更新:此外,如果您这样做,您将会点击N+1 query situation,因为每张发票都需要从数据库中检索其商品和付款。为避免这种情况,您需要在原始查询中包含项目和付款,如下所示:
current_user.invoices.includes(:items, :payments).to_a.select{ ... }