我在多租户(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
那么,这会在多用户设置中按预期工作吗?还有什么我需要做的吗?
答案 0 :(得分:2)
大多数rails应用程序都不能在多线程模式下运行 - 给定的实例一次只处理一个请求(这是默认设置)。
如果您的应用处于多线程模式,这将是危险的 - Money.default_currency
可能会在刚刚进入的新请求的中途发生更改。如果您确实想要使此线程安全,则可以使用每个线程值为Thread.current
default_currency
哈希值