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
我创建了一个初始化 @@sum
的 Finances.start
方法,并将调用移动到索引 do 块以及 idx
计数器,因此这些值实际上在每个索引执行代码。
它就像一个魅力。
我在 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
我创建了一个初始化 @@sum
的 Finances.start
方法,并将调用移动到索引 do 块以及 idx
计数器,因此这些值实际上在每个索引执行代码。
它就像一个魅力。