Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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 3应用程序以在Heroku上部署_Ruby On Rails_Model_Heroku_Gem_Multi Tenant - Fatal编程技术网

Ruby on rails 编写多租户Rails 3应用程序以在Heroku上部署

Ruby on rails 编写多租户Rails 3应用程序以在Heroku上部署,ruby-on-rails,model,heroku,gem,multi-tenant,Ruby On Rails,Model,Heroku,Gem,Multi Tenant,我正在为Heroku上的部署构建Rails 3应用程序,我想知道在我的模型中是否有关于如何处理多租户的建议。半年前,这里发布了一个相关的问题(),但没有得到很多答案。我也看了,但似乎3个提议的解决方案中有2个对Heroku不起作用。我想链接到这些,但新的Stackoverflow用户仅限于2个超链接 我还遇到了以下工具: 只是想知道您是否有使用多租户gem或简单rails多租户gem的经验。似乎最简单的解决方案是在我所有需要注册的模型上添加一个“属于”,但我真的很想知道您在现实世界中使用

我正在为Heroku上的部署构建Rails 3应用程序,我想知道在我的模型中是否有关于如何处理多租户的建议。半年前,这里发布了一个相关的问题(),但没有得到很多答案。我也看了,但似乎3个提议的解决方案中有2个对Heroku不起作用。我想链接到这些,但新的Stackoverflow用户仅限于2个超链接

我还遇到了以下工具:

只是想知道您是否有使用多租户gem或简单rails多租户gem的经验。似乎最简单的解决方案是在我所有需要注册的模型上添加一个“属于”,但我真的很想知道您在现实世界中使用的是什么

这些方法的范围从“不共享”到“共享一切”,前者通常意味着每个租户一个数据库,后者通常意味着每个表包含来自多个租户的行。可以按隔离程度、成本(即每个租户的成本)和灾难恢复的易用性来细分频谱(如下所示)

  • 每个租户一个数据库;最高的成本、最高的隔离度、最容易的恢复
  • 每个租户一个模式;其他两个之间的成本、良好的隔离、相当容易的恢复,但恢复通常会降低其他租户的性能
  • 租户共用桌子;成本最低,隔离最低(共享表),灾难恢复困难(恢复通常意味着为每个表恢复一些行)。恢复通常会“大量”降低其他租户的性能
所有这些在某种程度上都是特定于平台的。当dbms禁止查询访问多个数据库时,“每个租户一个数据库”具有最高的隔离度。但有些平台允许跨多个数据库进行查询

MSDN有一篇很好的文章达到了高潮:


但如果您仅限于Heroku,则必须选择Heroku支持的选项。我不知道这些选项可能是什么,但我知道最好不要在开发中使用SQLite。Heroku部署将在PostgreSQL上运行;您需要针对PostgreSQL进行开发。

作为多租户gem的作者,我显然有偏见,但我真的相信这是一个伟大的解决方案!gem的目标是简化这种常见的应用程序需求,并使其实现起来非常简单

“老派”的替代方法是使用rails对象链接,以确保所有查询都通过关联的父对象完成。这种方法的问题是,您的租户对象成为许多关联的转储地

class Tenant
  has_many :users
end
# query for users in the current tenant
current_tenant.users.find params[:id]
多租户gem通过确保生成的所有查询都自动知道当前租户来解决此问题。它还可以确保创建新记录并自动分配给当前租户,因此在保存回调之前不需要添加任何特殊记录

例:


我即将开始这项冒险(为一个小型rails应用程序实现多租户),在做研究时,我偶然发现了这篇文章

令人惊讶的是,没有人提到RyanB关于使用Heroku支持的PostgreSQL模式实现机器翻译的精彩视频

这里是到放映的链接

概念:

在rails应用程序中,我们可以为pg连接设置搜索路径

      connection.schema_search_path = "schema1, schema2, ..."
如果在schema1中找到相应的表,则将对其执行任何后续操作。否则,它将在schema2中搜索表,以此类推。要使用包括租户在内的整个应用程序架构,将是公共的,通常的做法是在公共架构中使除租户之外的所有表都为空

新租户登记:

在租户模型中添加after_create函数,为新租户创建新架构,并在此新架构中创建所有(load schema.rb)应用程序表(租户除外)

用户:

当用户访问subdomain1.myapp.com时,从租户表中查找此子域的架构,并将连接搜索路径设置为“schema1,public”,并对用户进行身份验证


请注意,我的目的只是介绍解决方案背后的概念。参考RyanB的屏幕广播了解实际的解决方案。

嘿,ryan,你为什么不使用默认的\u范围而不是使用Multientant.with\u租户方式?出于好奇,你是如何解决这个问题的?
      connection.schema_search_path = "schema1, schema2, ..."