我在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的值)
答案 0 :(得分:2)
首先,在开发模式下,当包含文件发生更改时,将卸载并加载所有类和模块,因此每次Rails重新加载类时,类变量都会重置为0.
此外,您必须记住,您在线程或多进程环境中工作,具体取决于您的Web服务器。也许您也在多主机环境中工作,因此您必须在多个线程或进程之间共享您的状态。
类变量或类实例变量可以在多处理环境中实现此目的(当您忽略竞争条件时),但它不适用于多进程或多主机环境。
使用Rails,您可以通过多种方式在请求之间共享状态,例如session
,数据库,文件系统等。
答案 1 :(得分:0)
我在模块/类定义上初始化计数器和累加器,而不是在执行时实际执行的代码上。
解决方案是:
index do |x|
Finances.start
idx = 0
我创建了一个初始化Finances.start
的{{1}}方法,并将调用移动到索引执行块以及@@sum
计数器,因此这些值实际上已在每个索引上初始化了代码执行。
它就像一个魅力。