我在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
然而,这个功能感觉很麻烦,我想知道如何使它更简洁。
感谢您的帮助。
答案 0 :(得分:2)
使用您的一组关联(付款通过分配有很多发票),您可以这样做:
def invoice_total_of_siblings
invoices.sum(:total)
end
编辑:
如果给定集合是ActiveRecord关联,则此解决方案按原样用于数据库字段。
然而,在这个特殊情况下,由于它是根据评论产生的,total
是一个计算字段。因此,给定的集合不是ActiveRecord关联,而是数组。然后,您需要映射该字段以便对其求和。在这种情况下,正确的语法是:
def invoice_total_of_siblings
invoices.sum(&:total)
end