在我的Rails应用中,我有users
,其中可以包含许多invoices
,而payments
可能会有很多payments
。
在我的信息中心视图中,我总结了到目前为止用户收到的所有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
条记录之一时,实例变量{{1}}不会重新加载。
如何实现这一目标?
也许有一种替代/更好的方法来解决这个问题?
感谢您的帮助。
答案 0 :(得分:0)
您可以使用类级变量来存储有关何时更新总和的信息。这是一个(可能)非功能性的例子,它应该显示它是如何工作的。
class Payment
after_save :update_sum
@@update = {}
def update_sum
@@update[user] = true
end
def sum
@sum = includes(invoice: :items) if @@update[user] || !@sum
@sum.select { |x| range.cover? x.date }.sum(&:"#{kind}_amount")
end
end