Rails多租户应用程序中全局变量的替代方法是什么?

时间:2013-02-06 16:13:13

标签: ruby-on-rails heroku multi-tenant

我正在将我的应用程序(单个客户端)转换为多租户应用程序。

我曾经将一些设置(很少更改/经常访问)存储到全局变量(哈希)中。 应用程序启动时,此全局变量的值已从数据库中拉出。 显然,这些设置特定于客户/租户。

我现在看到一些选项,但它们似乎都不好看:

  • 保留全局哈希,但引入租户$global[:client1][:settingX]的概念,但这感觉不太好/可扩展/安全
  • 每次都调用数据库,但我担心性能会受到影响(大约40次调用数据库)

我有什么可以用Memcache做的吗?但我不知道从哪里开始选择。

注意:该应用程序托管在Heroku上

1 个答案:

答案 0 :(得分:0)

这听起来像是使用memcached或redis的一个很好的论据。您需要一个集中的位置,这些值可以存在,可供所有应用服务器池访问。您的用例主要是通过偶尔写入更新值来阅读。

我会建立一个货币助手,每次请求从memcached / redis加载延迟一次,然后保存该请求中任何值计算的货币汇率数据。

我不知道您的问题域名,但我们假设您尝试向系统中的不同用户提供本地货币定价,并且不同用户的费率不同(即:折扣等)。

class CurrencyHelper
  attr_reader :currency_rates

  def initialize(user_id)
     @currency_rates = load_or_generate_exchange_rates
  end

  def load_or_generate_exchange_rates
    key = "/currency/rates/#{user_id}"
    REDIS.get(key) || begin
      rates = generate_exchange_rates
      REDIS.put(key, rates)
      rates
    end
  end

  def convert_from_usd_to(amount_usd, currency)
    round_money( usd * currency_rates[currency] )
  end
end

在控制器代码中:

  def currency_helper
    @currency_helper ||= CurrencyHelper.new(current_user.id)
  end

  def show
    localized_price = currency_helper.convert_from_usd_to(price_usd, params[:country_code])
  end