Ruby webscript在调用之间保留值



我有一个关于ruby的大问题:

class Finances
  @@sum = 0
  def self.add(amount)
    @@sum += amount
  end
  def self.total
    @@sum
  end
end

基本上是一个累加器。问题是,它的工作第一次,但它保留值每次我刷新使用该脚本的页面。(Rails + activeadmin)

ActiveAdmin.register Order, as: 'FinanceOrders' do
  idx = 0
  index do |x|
    column :id do
      idx += 1
    end
    column :contractor do |order|
      amount = order.contractor_payment_amount
      Finances.add amount
      amount.to_money
    end
    summary = Finances.get_summary collection
    tfoot do
      tr do
            column :contractor do |order|
              Finances.total.to_money
            end
            column :profit do |order|
              (order.sum_cost / 100).to_money * (1 - FEE) - Finances.total.to_money
            end
          end
        end
        td
      end
    end
  end
end

我想这是Rails上的某种类缓存。问题是,既然有缓存,我该如何完成我所需要的?(注意,即使idx, ids += 1也不起作用。它第一次工作得很好,但是在每次页面刷新时都会累积idx的值)

首先,在开发模式下,当包含的文件发生变化时,所有的类和模块都被卸载和加载,所以每次Rails重新加载你的类时,你的类变量都会重置为0。

此外,你必须记住,你是在一个线程或多进程的环境中工作,这取决于你的web服务器。也许您还在多主机环境中工作,因此您必须在多个线程或进程之间共享您的状态。

类变量或类实例变量可以在多线程环境中实现这一点(当您忽略竞争条件时),但它不适用于多进程或多主机环境。

使用Rails,您可以通过多种方式在请求之间共享状态,例如,session,数据库,文件系统等。

我是在模块/类定义上初始化计数器和累加器的,而不是在执行时实际执行的代码上初始化的。

解决方案是:

index do |x|
    Finances.start
    idx = 0

我创建了一个Finances.start方法来初始化@@sum,并将调用移动到索引做块,以及idx计数器,所以这些值实际上在每个索引做代码执行上被初始化。

效果很好

最新更新