2013-11-25 3 views
0

В моем приложении Rails у меня есть users, который может иметь много invoices, который, в свою очередь, может иметь много payments.Как сохранить записи пользователя в переменной, а затем отфильтровать их?

На мой взгляд, приборная панель у меня есть резюме всех payments, что пользователь получил до сих пор, либо суммируется месяц, по квартал или года.

Поскольку переключение между этими 3 режимами должен быть простым и быстрым, я понял, что это было бы хорошей идеей не использования областей здесь, но вместо того, чтобы хранить все платежи пользователя в переменной и фильтровать эту переменную в зависимости от того, какой режим пользователь выбирает (месяц, квартал или год).

В дополнение к этому существует также разделение на валовой, чистой и налогооблагаемых сумм.

class Payment < ActiveRecord::Base 

    belongs_to :invoice 
    belongs_to :user 

    def net_amount 
    invoice.subtotal * percent_of_invoice_total/100 
    end 

    def taxable_amount 
    invoice.total_tax * percent_of_invoice_total/100 
    end 

    def gross_amount 
    invoice.total * percent_of_invoice_total/100 
    end 

    def self.sum_within_range(range, kind) 
    @sum ||= includes(:invoice => :items) 
    @sum.select { |x| range.cover? x.date }.sum(&:"#{kind}_amount") 
    end 

end 

class User < ActiveRecord::Base 

    has_many :invoices 
    has_many :payments 

    def revenue_between(range, kind) 
    payments.sum_within_range(range, kind) 
    end 

end 

На первый взгляд это работает, но когда пользователь редактирует один из его payment записей, экземпляр переменной @sum не перезагружаются.

Как это можно достичь?

Возможно, есть альтернативный/лучший подход для решения этой проблемы?

Спасибо за любую помощь.

ответ

0

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

class Payment 
    after_save :update_sum 

    @@update = {} 

    def update_sum 
    @@update[user] = true 
    end 

    def sum 
    @sum = includes(invoice: :items) if @@update[user] || [email protected] 
    @sum.select { |x| range.cover? x.date }.sum(&:"#{kind}_amount") 
    end 
end 
+0

Спасибо. Однако я не смог заставить это работать. Я продолжаю получать эту ошибку: 'uninitialized class variable @@ update in Payment' – Tintin81

+0

Обновлено, чтобы добавить правильный инициализатор. – screenmutt

+0

ОК, спасибо. Эта ошибка исправлена. Но он жалуется на «неопределенный метод» пользователя в этой строке: '@sum || = includes (: invoice =>: items), если @@ update [user] || @ Sum'. Извините, я до сих пор новичок в Rails. Может быть, мне не хватает чего-то действительно фундаментального здесь. – Tintin81

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