Ruby webscript 在调用之间保留值

Ruby webscript preserving values between calls

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

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

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

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

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

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

解决方案是这样的:

index do |x|
    Finances.start
    idx = 0

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

它就像一个魅力。