Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails多租户应用程序中全局变量的替代方案是什么?_Ruby On Rails_Heroku_Multi Tenant - Fatal编程技术网

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

Ruby on rails Rails多租户应用程序中全局变量的替代方案是什么?,ruby-on-rails,heroku,multi-tenant,Ruby On Rails,Heroku,Multi Tenant,我正在将我的应用程序(单客户端)转换为多租户应用程序 我曾经将一些设置(很少更改/非常频繁访问)存储到一个全局变量(散列)中。 当应用程序启动时,此全局变量的值已从数据库中取出。 显然,这些设置是特定于客户端/租户的 我现在看到了一些选择,但没有一个是好的: 保留全局散列,但引入租户的概念$global[:client1][:settingX],但这感觉不太好/可伸缩/安全 每次都给数据库打电话,但我担心性能会受到影响(~40个额外的数据库电话) 我能用Memcache做些什么吗?但我不知道

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

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

我现在看到了一些选择,但没有一个是好的:

  • 保留全局散列,但引入租户的概念
    $global[:client1][:settingX]
    ,但这感觉不太好/可伸缩/安全
  • 每次都给数据库打电话,但我担心性能会受到影响(~40个额外的数据库电话)
我能用Memcache做些什么吗?但我不知道从哪里开始


注意:应用程序托管在Heroku上,这听起来是使用memcached或redis的一个很好的理由。你想要一个集中的地方,让所有的应用服务器都可以访问这些值。您的用例主要是读取,偶尔会写入以更新值

我将构建一个货币助手,每个请求延迟从memcached/redis加载一次,然后保存货币汇率数据,以便在该请求中进行任何值计算

我不知道您的问题域,但假设您试图为系统中的不同用户提供本地货币定价,并且不同用户的费率不同(例如:折扣等)

在控制器代码中:

  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

为什么会是40个DB调用?在这个典型示例中:因为我需要执行40个货币转换。因此,如果使用同一种货币两次,其中一些可能会被缓存,但我不能依赖这个假设。我可以一次性加载所有必要的汇率,但那根本不现实。。。
  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