Ruby webscript在调用之间保留值

时间:2016-10-06 15:20:03

标签: ruby-on-rails ruby singleton activeadmin

我在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的值)

2 个答案:

答案 0 :(得分:2)

首先,在开发模式下,当包含文件发生更改时,将卸载并加载所有类和模块,因此每次Rails重新加载类时,类变量都会重置为0.

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

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

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

答案 1 :(得分:0)

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

解决方案是:

index do |x|
    Finances.start
    idx = 0

我创建了一个初始化Finances.start的{​​{1}}方法,并将调用移动到索引执行块以及@@sum计数器,因此这些值实际上已在每个索引上初始化了代码执行。

它就像一个魅力。