Rails中类变量的线程安全 - 这会起作用吗?

时间:2012-01-31 16:53:22

标签: ruby-on-rails ruby ruby-on-rails-3 thread-safety currency

我在多租户(SaaS)Rails应用中使用Ruby Money gem,并且正在寻找一种方法,可以将Money.default_currency设置为每个请求的帐户首选项。我在应用程序中有几个与货币相关的模型使用Money类。

我在开发过程中一切正常,但我只是在寻找一些关于解决方案是否会对生产产生影响的反馈。

这是我在ApplicationController中所做的事情(为简洁起见,删除了无关的代码):

class ApplicationController < ActionController::Base
  before_filter :set_currency

  private

  def set_currency
    Money.default_currency = Money::Currency.new(current_account.present? && current_account.currency.present? ?
                                                 current_account.currency : 'USD')
  end
end

因此,上面的代码会将default_currency类变量设置为当前帐户的首选项,如果没有,则默认返回“USD”。

顺便说一句,这是Money类中相关的default_currency代码:

class Money

  # Class Methods
  class << self

    # The default currency, which is used when +Money.new+ is called without an
    # explicit currency argument. The default value is Currency.new("USD"). The
    # value must be a valid +Money::Currency+ instance.
    #
    # @return [Money::Currency]
    attr_accessor :default_currency

  end
end

那么,这会在多用户设置中按预期工作吗?还有什么我需要做的吗?

1 个答案:

答案 0 :(得分:2)

大多数rails应用程序都不能在多线程模式下运行 - 给定的实例一次只处理一个请求(这是默认设置)。

如果您的应用处于多线程模式,这将是危险的 - Money.default_currency可能会在刚刚进入的新请求的中途发生更改。如果您确实想要使此线程安全,则可以使用每个线程值为Thread.current

default_currency哈希值