我正在组织一个具有单个代码库/应用程序的多租户应用程序,使用子域来检测租户,然后在 postgres 上运行 SET SCHEMA 来完成有趣的事情。
我的问题是,某些客户需要对主代码库进行不同级别的定制。虽然不是很多,但肯定足以让我不想通过添加一堆 if 语句来开始破解主要模型和控制器。
使用视图加载路径覆盖视图很容易......但我的问题是:如何提供一个良好的框架来覆盖或向基本控制器、模型和助手添加功能,以便根据需要为每个租户调整内容?理想情况下,它应该非常无缝,不会侵入主代码,并且应该提供一个不错的机制来组织定制代码。
我研究了一些选项,包括使用包含/扩展(mixins)。问题是在生产中,方法保留在对象中(可以理解)。我已经尝试过混合学宝石来解决这个问题,但它并没有完全按照我的预期工作,而且它比我希望的更具侵入性,我也不清楚如何将它与模型联系起来(在控制器中,我刚刚尝试通过前/后过滤器混合/取消混合)。
如果有人对如何最好地处理/解决这个问题有任何想法,我将非常感谢您的反馈。 FWIW这是Rails3
如果您正在谈论在请求之间动态切换数据库,那么我认为您会陷入困境,至少在使用 ActiveRecord 时是如此。这会严重扰乱缓存系统,因为它会根据 ID 来记住内容,而不是 ID + Schema,这可能会导致交叉污染。
一般来说,从体系结构的角度来看,最好在内部对数据库进行分区,并相应地确定每个记录的范围。例如:
class Site < ActiveRecord::Base
# Represents a site or installation of the application
end
class User < ActiveRecord::Base
belongs_to :site
end
将所有内容链接到主目录Site
记录,或任何最能描述您用于分区的方法的术语。维护一致的范围比切换模式要容易得多。
如果出于扩展的原因,您希望将来拆分数据库,如果您已经小心地使用一致的标记标记了站点的所有关联记录site_id
列,您可以轻松地将所有这些记录转置到新数据库中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)