使用 Puma 时初始化 BigDecimal 限制的正确位置在哪里

Where is the correct place to initialize BigDecimal limit when using Puma

我有一个 rails 初始化程序,它设置了大十进制数的限制

BigDecimal.limit(20)

这已执行并且似乎正确设置了限制。

但是当网络请求进来时(我使用的是 Puma),处理请求的线程似乎没有设置限制。限制设置为默认值 0。

我应该在其他地方设置限制吗?

如果要复现:

创建一个全新的 rails 应用程序并添加一个设置限制的初始化程序

BigDecimal.limit(20)
puts "*** Set #{BigDecimal.limit}"

在您的应用程序控制器中添加

before_action :check_big_decimal

def check_big_decimal
  puts "***request #{BigDecimal.limit}"
end

启动您的服务器,刷新页面并发出请求

您应该会看到它设置为 20,但当收到请求时它又回到 0。

一种不推荐的方法是猴子修补 class。您可以在初始化程序中添加它

class BigDecimal
  def self.limit(val = 25)
    25
  end
end

问题是,你真的真的想在所有地方都限制为 25 个吗?如果是,那么您可以尝试将此作为最后的手段,因为我不确定对该值进行硬编码(并完全覆盖该方法)的副作用

我从 Rails community

那里得到了答案

基本要点是:

发生这种情况是因为 Ruby 将 BigDecimal 限制存储在线程本地存储中。 当例如Puma 开启新线程处理请求,新线程无法访问初始线程中设置的BigDecimal限制。