2

所以我正在使用 rails 3.2.11 开发一个多租户 rails 应用程序。我们选择了模式方法,因此我们使用单个 Postgres 数据库。根据子域加载正确的架构。我们通过为每个模式创建一个数据库用户来增加数据库端的安全性,该用户只有权访问其自己的模式中的数据。

我用于检查子域和建立正确数据库连接的所有代码都before_filter在我的应用程序控制器内部的一个方法中。

我的方法只是更改了search_path,然后我使用以下内容ActiveRecord::Base.establish_connection更改数据库用户名和密码。

我已经编写了几个测试并浏览了该应用程序,以确保它一切正常并且数据保存在正确的模式中(即使同时使用多个子域),到目前为止一切都很好。

但我有两个大问题想问:

  1. 我现在正在使用该ActiveRecord::Base.establish_connection调用来建立数据库连接。因此,我刚刚从我的 database.yml 文件中删除了所有代码,一切仍然正常。但是...我以前从来没有做过这样的事情,有没有更正确的方法呢?我担心这可能会导致一些错误..

  2. 就像我之前说的,before_filter调用一个方法来建立正确的数据库连接。但是就像我说的那样,我使用的是before_filter,所以每次用户更改页面时,都会重新建立连接。我担心这可能会导致性能问题,尤其是随着应用程序的增长。而且我不确定我是否忽略了任何东西,这可能会导致一些无法预料的错误。有没有人有这方面的经验,可以就如何处理这个问题提供一些建议?也许有办法添加代码,说明如果建立了正确的初始数据库连接,那么除非子域发生变化,否则不要再次重新建立连接?

谢谢。

4

1 回答 1

2

这可能对您有用:https ://github.com/influitive/apartment

Rails 3 和 ActiveRecord 的多租户

Apartment 提供了一些工具来帮助您处理 Rails 应用程序中的多个数据库。如果您需要基于帐户或公司隔离某些数据,但仍允许某些数据存在于公共数据库中,Apartment 可以提供帮助。

此外,这里有很多关于 SO 的多租户问题,请查看

于 2013-12-05T06:39:48.590 回答