2013-10-26 71 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) 

这也解决了你如何从两个类中调用它们的问题。总是像这样更新这些列。