Ruby on rails RubyonRails3:如何通过关联方法查找关联记录?

Ruby on rails RubyonRails3:如何通过关联方法查找关联记录?,ruby-on-rails,Ruby On Rails,我有很多项目和付款的发票 这是我的发票模型(至少是其中的一部分): 现在,在“付款”视图中,我正在尝试查找余额小于0的所有发票: <%= f.select(:invoice_id, current_user.invoices.where("balance > ?", 0)) %> 这当然行不通,因为balance不是一列。但是我怎样才能在那里插入一个方法呢 谢谢您的帮助。您有两个选择。您可以始终将余额列为一列(在添加付款或项目时根据需要进行更新),这将允许您高效地执行此类

我有很多项目和付款的发票

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

现在,在“付款”视图中,我正在尝试查找余额小于0的所有发票:

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

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


谢谢您的帮助。

您有两个选择。您可以始终将
余额
列为一列(在添加付款或项目时根据需要进行更新),这将允许您高效地执行此类查询

然而,您可以只使用一种简单的Ruby方法——具体地说。差不多

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

谢谢你,安迪!我会试试你的建议。但这真的是如此低效吗?如果我将余额存储在数据库中,这难道不是“冗余数据”,因为它可以使用其他两个表列进行计算吗?我不熟悉Ruby和Rails,所以我想知道专业人士是如何做到的。现在,我正在尽可能地使用虚拟属性。但不确定这是否好…这将是相当低效的。首先,当您只对少数发票感兴趣时,返回所有发票-这将减慢查询速度并浪费一些内存。其次,要每次重新计算余额,您必须循环所有发票的所有付款和所有项目,这将花费一些cpu周期。因此,这将是一个性能打击-它有多糟糕取决于每个用户的发票数量,以及您进行计算的频率。此外,最佳做法是避免将逻辑放入视图中。您可以在控制器中执行查询,并使用实例变量将结果向下传递到视图,然后执行
。更好的是,您可以在用户模型上创建
未付发票
方法。好的,如果我有一个显示每个发票(计算)余额和总额的所有用户发票的索引视图,那么可能最好将这两个虚拟属性转换为表列…?是的,在这种情况下,我会这样做。虚拟属性很好,但只有在计算它们的成本不太高的情况下-例如,将
全名
放在一起。
current_user.invoices.to_a.select {|invoice| invoice.balance < 0}
current_user.invoices.includes(:items, :payments).to_a.select{ ... }