如何将用户的记录存储在变量中然后过滤它们?

时间:2013-11-25 11:48:37

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

在我的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}}不会重新加载。

如何实现这一目标?

也许有一种替代/更好的方法来解决这个问题?

感谢您的帮助。

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