2013-10-26 3 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 в модель 'Payment' ... –

+0

@amitkarsale: ОК, я переименовал их. – Tintin81

ответ

0

Вы делаете что-то очень опасное здесь. Убедитесь, что вы используете sql для изменения значения вместо установки нового значения.

Представьте себе следующее: Сумма счета: 1000 Пользователь1 вычитает 100, но делает это с очень медленным запросом. Сразу после запуска пользователя 1 пользователь2 вычитает 500 и делает это очень быстро.

Поскольку вы делаете это в приложении, вы получаете выдающееся количество 900, так как это последний выполненный метод. update_counters создает «безопасный» sql-запрос.

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

Это также решает вопрос о том, как назвать их из двух классов. Всегда обновляйте эти столбцы следующим образом.

Смежные вопросы