使用PostgreSQL的模式和Rails创建多租户应用程序

我已经弄明白了

我正在学习如何在Rails中创建一个多租户应用程序,该应用程序根据用于查看应用程序的域或子域提供来自不同模式的数据

我已经回答了一些问题:

  1. 如何让子域fu也与域一起工作?这里有人问了同样的问题,这让你来到了这个博客
  2. 什么数据库,它将如何构造?这是Guy Naor的精彩演讲,也是关于PostgreSQL和模式的好问题
  3. 我已经知道我的模式都将具有相同的结构。他们掌握的数据会有所不同。那么,如何为所有模式运行迁移呢?下面是一个答案

这三点涵盖了我需要知道的很多一般性的东西。然而,在接下来的步骤中,我似乎有很多实现方法。我希望有更好更简单的方法

最后,请回答我的问题

当新用户注册时,我可以轻松创建模式。但是,加载其他模式已经拥有的结构的最佳和最简单的方法是什么?下面是一些问题/场景,可能会让您有更好的想法

  1. 我是否应该将其传递给一个shell脚本,该脚本将公共模式转储到一个临时模式中,并将其导入回我的主数据库(就像盖伊·内奥在视频中所说的那样)?下面是我从freenode上有用的博士后那里得到的一个快速摘要/脚本。虽然这可能会起作用,但我必须在Rails之外做很多事情,这让我有点不舒服。。这也引出了下一个问题
  2. 有没有一种直接从RubyonRails实现的方法?就像创建一个PostgreSQL模式一样,只需将Rails数据库模式(schema.rb-我知道,这很混乱)加载到该PostgreSQL模式中
  3. 是否有一个gem/插件已经具备了这些功能?方法如;创建“pg模式”和“加载轨道模式”(新模式名称);。如果没有,我可能会制作一个,但我怀疑它是否能在所有移动部件上得到很好的测试(特别是如果我最终使用shell脚本来创建和管理新的PostgreSQL模式)

谢谢,我希望不会太久

2011年12月5日更新

多亏了布拉德·罗伯逊和他的团队,才有了公寓的瑰宝。这是非常有用的,做了很多繁重的工作

然而,如果您要修补模式,我强烈建议您了解它实际上是如何工作的。熟悉Jerod Santo的演练,这样你就会知道公寓宝石或多或少在做什么

更新2011年8月20日11:23 GMT+8

有人写了一篇博文,很好地完成了整个过程

更新2010年5月11日11:26 GMT+8

从昨晚开始,我就能够找到一个方法来创建一个新的模式并将schema.rb加载到其中。不确定我所做的是否正确(到目前为止,似乎工作得很好),但至少离我更近了一步。如果有更好的办法,请告诉我


模块模式
定义self.add_schema_到_路径(schema)
conn=ActiveRecord::Base.connection
conn.execute“将search_path设置为#{schema},#{conn.schema_search_path}”
终止
def self.reset_search_路径
conn=ActiveRecord::Base.connection
conn.execute“将搜索路径设置为#{conn.schema_搜索路径}”
终止
定义self.create_和migrate_模式(模式名称)
conn=ActiveRecord::Base.connection
schemas=conn.select_值(“从pg_名称空间中选择*,其中nspname!=“信息_schema”和nspname与“pg%”不同”)
if schemas.include?(schema\u name)
表=连接表
Rails.logger.info“#{schema_name}已与这些表#{tables.inspect}一起存在”
其他的
Rails.logger.info“即将创建#{schema_name}”
conn.execute“创建模式#{schema_name}”
终止
#保存旧的搜索路径,以便我们可以在该方法结束时将其设置回原处
旧搜索路径=conn.schema搜索路径
#试图像上面的方法一样设置搜索路径(来自Guy Naor)
#[方法1]:conn.execute“将搜索路径设置为#{schema_name}”
#但是连接本身似乎记住了旧的搜索路径。
#当Rails执行模式时,它首先询问它将加载的表是否已经存在,以及:force=>true。
#如果这两个都为真,它将删除表,然后加载它。
#问题是,在方法1的设置方式中,ActiveRecord::Base.connection.schema\u search\u path仍然返回$user,public。
#这意味着,当Rails尝试加载模式并询问表是否存在时,它会在公共模式中搜索这些表。
#请参阅Rails 2.3.5 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb中的第655行
#这就是为什么我一直遇到表存在的错误,而它不存在(在新创建的模式中)。
#如果用这种方法[方法2],它是有效的。ActiveRecord::Base.connection.schema\u search\u path返回传递给它的字符串。
conn.schema\u search\u path=schema\u name
#直接从databases.rake。
#在Rails 2.3.5 databases.rake中,可以在railties/lib/tasks/databases.rake中找到
file=“#{Rails.root}/db/schema.rb”
如果File.exists?(文件)
Rails.logger.info“即将加载模式#{file}”
加载(文件)
其他的
中止%{{file}尚不存在。可能您刚刚运行了迁移!}
终止
Rails.logger.info“即将将搜索路径设置回#{old_search_path}”
conn.schema\u search\u path=旧的\u search\u路径
终止
终止

发表评论