我正在组织一个具有单个代码库/应用程序的多租户应用程序,使用子域来检测租户,然后在postgres上运行一组模式来做有趣的事情。
我的问题是,某些客户端需要对主代码库进行不同级别的定制。不是很多,但肯定足够了,我不想通过添加一堆if语句来开始修改主要的模型和控制器。
使用视图加载路径覆盖视图非常简单……但我的问题是:我如何才能提供一个好的框架来覆盖或添加基本控制器、模型和帮助器的功能,以便根据需要调整每个租户的内容?理想情况下,它应该是非常无缝的,并且不会侵入主代码,并且应该为组织定制的代码提供一种合适的机制。
我研究了一些选项,包括使用包含/扩展(mixins)。问题是,在生产中,方法停留在对象中(可以理解)。我尝试过混搭gem来解决这个问题,但它并不完全像我预期的那样工作,而且它比我希望的要更具侵入性,我也不清楚如何将它与模型联系起来(在控制器中,我刚刚通过之前/之后的过滤器尝试了混入/解混)。
如果任何人对如何最好地处理/解决这个问题有任何想法,我将非常感谢您的反馈。FWIW这是Rails3
发布于 2011-05-03 00:23:24
如果你谈论的是在请求之间快速切换数据库,那么我认为你将面临一个痛苦的世界,至少在使用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列标记站点的所有相关记录,则可以轻松地将所有这些记录转置到一个新数据库中。
发布于 2011-06-15 11:33:51
一个钩子+插件的设置能满足你的需求吗?例如:将附加功能构建到另一个模型中,在任何需要修改的操作上检查钩子表,看看用户是否需要任何额外的操作,钩子表还指定了要采取的操作,以便您可以轻松地为不同的用户设置不同的配置。
如果你找到了更好的答案,请更新。
https://stackoverflow.com/questions/5858946
复制相似问题