Ruby on Rails 3:如何通过相关方法查找关联记录?

时间:2012-09-27 12:39:33

标签: ruby-on-rails

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

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

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 不是一列。但是我怎么能在那里插入一个方法呢?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你有几个选择。您可以始终将balance作为列(在添加付款或项目时适当更新),这样您就可以有效地执行此类查询。

但是,您可以使用纯Ruby方法 - 特别是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{ ... }