如何在Ruby on Rails中获取连接表中的发票总和?

时间:2014-06-25 08:51:12

标签: ruby-on-rails ruby activerecord

我在Rails 4应用程序中有这些模型:

class Invoice < ActiveRecord::Base

  has_many  :allocations
  has_many  :payments, :through => :allocations

end

class Allocation < ActiveRecord::Base

  belongs_to :invoice
  belongs_to :payment

end

class Payment < ActiveRecord::Base

  has_many    :allocations
  has_many    :invoices, :through => :allocations

end

显然,一个payment可能属于许多invoices

Payment模型中,我有此功能可以汇总一项特定付款所涉及的所有invoices的总和:

def invoice_total_of_siblings
  invoice_ids = Allocation.where(:payment_id => id).map(&:invoice_id)
  invoices = Invoice.where(:id => invoice_ids)
  invoices.to_a.sum(&:total)
end

然而,这个功能感觉很麻烦,我想知道如何使它更简洁。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

使用您的一组关联(付款通过分配有很多发票),您可以这样做:

def invoice_total_of_siblings
    invoices.sum(:total)
end

编辑: 如果给定集合是ActiveRecord关联,则此解决方案按原样用于数据库字段。

然而,在这个特殊情况下,由于它是根据评论产生的,total是一个计算字段。因此,给定的集合不是ActiveRecord关联,而是数组。然后,您需要映射该字段以便对其求和。在这种情况下,正确的语法是:

def invoice_total_of_siblings
    invoices.sum(&:total)
end