2013-10-26 66 views
0

在我的Rails應用程序,我有這樣的:如何判斷哪些類在Ruby on Rails中調用方法?

class Invoice < ActiveRecord::Base 

    has_many :payments 

    before_save :save_outstanding_amount 

    def save_outstanding_amount # atomic saving 
    self.outstanding_amount = new_outstanding_amount 
    end 

    def update_outstanding_amount # adds another SQL query 
    update_column(:outstanding_amount, new_outstanding_amount) 
    end 

    private 

    def new_outstanding_amount  
     total - payments.sum(&:amount) 
    end 

end 

怎樣才能讓這個充滿活力,從而使第一方法從Invoice類和第二種方法的所有實例稱爲會從其他類的所有實例調用,例如Payment課?

+1

爲什麼方法名稱相同,爲什麼不同名稱與動作不同... –

+1

然後,您應該將版本B置於「支付」模型中...... –

+0

@amitkarsale:好的,我將它們重命名。 – Tintin81

回答

0

你正在做一些非常危險的事情。確保使用sql來更改值而不是設置新值。

想象一下: 發票金額:1000 用戶1扣除100,但用非常緩慢的請求進行處理。 用戶1剛剛啓動後,User2會扣除500,並且確實很快。

由於您在應用程序內部執行此操作,因此最終執行的方法數最多爲900。 update_counters創建一個'安全'sql查詢。

self.class.update_counters self.id, payments.sum(&:amount) 

這也解決了你如何從兩個類中調用它們的問題。總是像這樣更新這些列。