2014-01-12 211 views
0

我得到一个资源发票和资源invoicelineRails ActiveRecord更新头记录

当我创建,更新或删除一个invoiceline 总和列的父,发票应更新。

这是如何在轨道中实现的?

回答

1

你可以用回调做到这一点,像

class InvoiceLine < ActiveRecord::Base 
    after_destroy :calculate_invoice_sum 
    after_save :calculate_invoice_sum 

    belongs_to :invoice 

    def calculate_invoice_sum 
    if invoice 
     invoice.calculate_invoice_sum 
    end 
    end 
end 

class Invoice < ActiveRecord::Base 
    has_many :invoice_lines 

    def calculate_invoice_sum 
    # assuming InvoiceLine has an amount attribute 
    total = invoice_lines.sum(&:amount) 
    update_attribute(:sum, total) 
    end 
end 

你可能想before_回调,而不是after,但我觉得更有意义,在这种情况下

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

http://api.rubyonrails.org/classes/Enumerable.html#method-i-sum

1

counter_cache选项,你可以传递给belongs_to关联。在invoices

class InvoiceLine < ActiveRecord::Base 
    belongs_to :invoice, dependent: :destroy, counter_cache: :sum_column 
end 

请注意,你应该有列名sum_column(对,上面的例子):对于你的模型,你定义belongs_to关联如下。

+0

我的猜测是他想要总和每个invoice_line的金额,第i个墨水counter_cache将只更新invoice_line记录的计数? – house9

+0

同样的问题发生在我身上。它如何知道总结哪个invoiceline专栏?如果它只是计数好的子记录也是有用的,但我希望把所有的记录总和记为@ house9所说的 – ZoolWay