【问题标题】:How to turn a single-site app into a mantainable multi-site app without code changes?如何在不更改代码的情况下将单站点应用程序转变为可维护的多站点应用程序?
【发布时间】:2009-11-16 12:14:16
【问题描述】:

这是一个我们在办公室内部使用的应用程序,我想将它作为托管服务提供给任何人。

如何在不进行重大代码更改的情况下做到这一点?

我想到的第一件事是让应用程序根据域选择要连接的数据库。

因此应用程序的每个实例都有自己的数据库,但所有实例都将共享相同的代码。

代码所需的唯一更改是数据库选择。

这种方法是否可维护?我听说 wordpress.com 这样做了,并且它提供了几个优点。我主要希望通过这种方式来避免将我的整个数据库查询集限定到同一数据库中的某个站点。

谢谢!

【问题讨论】:

  • 我以前做过,但需要更改代码。我很想知道这是否可以在不更改代码的情况下实现。
  • 为什么不把通用代码做成插件呢?
  • 我认为他的意思是在不对代码进行重大重新设计的情况下执行此操作,而不是字面上没有代码更改。

标签: ruby-on-rails ruby database-design web-applications


【解决方案1】:

最简单的方法是克隆应用程序,然后创建另一个服务器实例来处理它。这实际上是我在服务器上处理多个 wordpress 博客的方式

专业版:

  • 可以将此过程简化为实用程序脚本。
  • 如果符号链接用于公共代码,则可以轻松维护。 IE:除了品牌和 config 目录中的一些内容之外的所有内容。

缺点: - 如果您使用乘客,则需要为每个新实例重新启动 apache。 - 如果您使用 Apache 将不同虚拟主机上的子域路由到不同的 mongrel 集群,则相同。

但是更好的方法来自问题:Rails - Separate Database Per Subdomain

接受的答案中的方法更加健壮。它可能需要比您想要的更多的更改,但它具有所有优点,没有任何其他方法的缺点。每个新实例都需要主数据库中的一个新条目,其中包含表名和其他实例特定信息。您还需要自定义 rake 任务来为每个新实例构建数据库。

【讨论】:

    【解决方案2】:

    我建议切换数据库连接并添加基于域的view_path,我已经在this question中发布了代码。

    我希望这会有所帮助!

    【讨论】:

    • +1 用于提供我链接到的答案。 -1 表示没有注意到并且没有指出潜在的陷阱。
    【解决方案3】:

    我不会像您提到的那样对多个数据库执行此操作。使所有模式/迁移与所有数据库保持同步可能会变得很痛苦。

    我会考虑将其简单地制作成一个多租户应用程序,其中您有某种“帐户”模型,然后您现有的所有模型都适用于它......换句话说,如果这是一个博客应用程序,您的帐号 has_many :posts 等

    使用这种方法,您可以按子域识别帐户...让人们在创建帐户时选择他们的子域并从那里开始。

    这很简单。如果您需要将计费添加到组合中,您可以查看SaaS Railskit(处理所有注册和子域内容)或Chargify

    您还可以使用http://myapp.com/someuser 识别 Twitter 风格的帐户...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2016-08-25
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2016-09-09
      相关资源
      最近更新 更多