我有一个关于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
计数器,所以这些值实际上在每个索引做代码执行上被初始化。
效果很好