ruby-on-rails - 如何在 gem 和父应用程序中配置 ActiveRecord 连接?
问题描述
精简版:
如何在 Rails 应用程序和 gem 中基于相同的config/database.yml
. 配置仅在schema_search_path
值上有所不同
长版:
我有一个 Rails 应用程序(父级),我将它的一部分提取到一个 gem(子级)中。子应用程序只是一个拥有自己模型的宝石。不是导轨引擎或可安装的导轨引擎。它的模型将存在于同一个 Postgres 数据库中,但存在于一个单独的模式中。例如,父应用程序模型在public
模式中,子应用程序模型在child
模式中。
作为旁注,我正在使用 gem 管理迁移并在父级和子
standalone-migrations
级上分别运行迁移,因此子级在其架构中拥有自己的表schema_migrations
Rails 允许包含数据库配置,schema_search_path
因此我计划使用它来提供两种配置。
我想避免将 复制config/database.yml
到子schema_search_path
gem,因为除了每个环境之外,文件都是 100% 相同的。
我的想法(这是行不通的)是在子gem 中使用railtie初始化回调来设置Child::ApplicationRecord.configurations = conf_with_the_correct_schema_search_path
使用这种方法,子模型(例如使用 访问Child::Name.all
)工作,但手动添加的配置(在 railtie 中)也被用于父应用程序。由于schema_search_path
is中唯一的模式,因此child
将找不到任何父模型。
在 Rails 控制台中手动分配配置时,我可以访问两个应用程序的模型,直到我这样做ModelBaseClass.establish_connection
,这将使用最新的配置并使父模型或子模型无法访问。例如
- 在父母中:
ApplicationRecord.configurations = YAML.load(...)
- in child : 基于父配置创建
子配置示例:
add_child_schema_lookup = ->(acc, keyval) do
k, v = keyval
acc.merge({k => v.merge(schema_search_path: 'child')})
end
child_configs = ApplicationRecord.configurations.reduce({}, &add_child_schema_lookup)
Child::ApplicationRecord.configurations = child_configs
解决方案
推荐阅读
- python - 如何检测布尔变量的摆动状态
- reactjs - 调用调度后如何导航到新页面
- libgdx - 为什么舞台上的相机不需要在libgdx中居中
- mysql - 使用合适的日期格式创建 MySQL 表 dd/MMM/yyyy:hh:mm:ss Z
- ios - 无法在正在运行的 Xcode 项目中添加 Xcode proj 库
- angular - 自定义 AWS Amplify cognito 登录/注册组件?
- javascript - firebase 函数返回未定义的预期承诺或值
- c - 在 C 中的 bmp 图像之间导航/滚动
- perl - 如何使用 Net::SSH::Perl 检查远程目录是否存在
- c# - 使用 Task.run 和不使用 Task.run 将项目发布到 TPL 操作块