【问题标题】:multiple databases on global level in RailsRails 中全局级别的多个数据库
【发布时间】:2021-04-28 12:57:04
【问题描述】:

我知道 Rails 6 支持多个数据库,但它似乎是在模型级别,就像我们告诉每个模型它属于哪个数据库一样。

客户想要两个具有相似架构的生产服务器数据库

primary_live_database
secondary_test_database

想法是应用程序将发送一个标头参数来为其测试应用程序或实时应用程序提供提示,并根据此切换数据库。

我们怎样才能做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql


    【解决方案1】:

    您真的只是想设置一个额外的环境。这是通过设置RAILS_ENV 环境变量来完成的。通常这样的环境被称为staging,但它真的取决于你想怎么称呼它。

    设置RAILS_ENV = 'staging' 将:

    • 导致 Rails 加载 config/environments/staging.rb
    • Rails 将使用config/database.yml 中的staging 设置。
    • 如果您的 Rails 版本支持每个环境的机密,staging 的机密将从 config/secrets.yml.enc 加载。
    • Rails.env == 'staging'Rails.env.staging? == true

    这使您可以运行生产环境的近似副本,但设置不同。例如,您经常希望将临时环境的访问权限限制为协作者,或者将更改推送到临时环境,以便在可能尚未准备好生产的功能上进行协作。

    如果您的客户反应是 Waaaaaaah, so much work!,那么您可以在 ApplicationController 中使用回调来调用 ActiveRecord::Base.establish_connection。不过我不推荐。

    【讨论】:

    • 如果客户的反应是“哇哇哇,辛苦了!”等到他们意识到临时上下文切换的维护费用。
    • @engineersmnky 你能解释一下为什么切换数据库会导致维护成本增加吗?您是在谈论代码复杂性还是实际基础架构成本?
    • @max 所以我只需要设置 RAILS_ENV = 'development' 和 RAILS_ENV = 'production',取决于请求还是什么?我可以使用现有的开发环境吗?
    • @max 基础设施差异是名义上的(代码库或多或少托管)代码复杂性和调试可能是一个问题。如果客户离开 A 公司并将代码库转移到 B 公司,我已经看到类似的(概念上)“非常规”设置也会造成重大破坏。Rails(以及一般的 ruby​​)提供了如此显着的灵活性,有时可能看起来很小现在的特质最终可能会在未来付出巨大的代价。
    • @MuhammadFaisalIqbal 否 - 关键是您不想按请求执行此操作。设置不同的容器、heroku 应用程序或您的客户使用的任何基础设施。在不同的 url(例如子域)上具有陈述环境。根据请求设置它会导致进程分叉等优化。
    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2019-01-01
    • 2021-07-25
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多