【发布时间】:2014-05-18 21:27:14
【问题描述】:
我正在构建一个应用程序,其中每个公司都有自己的私有模式 (Postgresql)。
对于每个申请,我在 before_action 中设置 Postgres 搜索路径,如下所示:
ActiveRecord::Base.connection.schema_search_path = 'company_id, public'
我的疑问是,如果我有多个独角兽工人,并且一个工人“A”设置了路径,而另一个工作“B”在工人 A 完成之前设置了路径,我认为这会产生一些冲突和“A”工人可能会意外地从错误的架构中保存/读取模型,对吧?
还有其他解决方案可以更好地配合 Unicorn 设计吗?
编辑,架构详情:
每家公司都有很多用户。用户和公司表都存在于公共模式中,其余的(产品、客户...)存在于私有模式中
编辑,更多研究:
经过一番研究,我发现每个数据库客户端连接都有自己的搜索路径。因此,如果我使用一个连接更改搜索路径,其他连接不会受到影响,因此这可以与 Unicorn 一起使用,因为每个请求都有自己的连接,但它不适用于 Puma 等多线程服务器。
但是,答案中仍然存在一些问题,例如 ActiveRecord 为每个请求重新加载架构。我想听听有人在生产中使用这种方法的经验。
【问题讨论】:
-
每个唯一的公司都有自己的登录名,还是所有公司共享相同的登录名?另外,这些公司是如何访问数据库的?
-
每个公司都有很多用户。用户和公司表都存在于公共模式中,其余的则存在于私有模式中。
-
嗯,我对 Rails 的了解还不够,我确实发现这只会加强你的怀疑:groups.google.com/forum/#!topic/rails-oceania/tvzC85huXEA
-
@Jirico,我已经在生产环境中解决了这个问题,并且我提供了一种替代方法(您的问题提出了这个问题),同时深入了解了为什么在没有 AR 解析模式的情况下动态更改模式路径会造成类型处理的风险。仅仅因为您想要/首选的方法存在实际问题/风险和问题,并不会使答案或建议无效。我已邀请您自己检查适配器代码并解释了您所面临问题的详细信息。
-
我同意,到目前为止,您的回答是最完整的。我将在生产中尝试我的方法,我将继续更新这个线程关于我的结果。感谢您的帮助。干杯
标签: ruby-on-rails postgresql activerecord rails-activerecord unicorn