You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails生产环境控制台无法默认访问多数据库问题咨询

问题原因

这是Rails多数据库配置在生产环境的加载逻辑差异导致的,核心有两点:

  1. 缺失primary默认数据库配置
    Rails默认要求每个环境的database.yml中必须声明primary数据库作为ActiveRecord::Base的默认连接,你当前配置中development和production节点下直接放置了tp、mi两个库,没有显式声明primary,Rails会自动将环境下第一个声明的库(也就是写在前面的tp)作为默认连接。
  2. 生产环境的预加载逻辑差异
    生产环境默认开启eager_load(预加载全量代码),同时只会预先建立primary库的连接,不会主动初始化所有模型声明的自定义连接。
    开发环境是按需加载代码:你调用Landlord.first时会先加载ApplicationRecord,触发其connects_to配置,正常建立mi库连接后再执行查询,所以没有问题。
    生产环境预加载代码时,如果TpBase和Servant优先被加载,会先触发ActiveRecord::Base建立tp库的默认连接,后续加载ApplicationRecord时,其connects_to配置没有被正确触发应用到Landlord类上,导致Landlord继承了默认的tp连接,去tp库找landlord表自然报错。
修复方案

方案1:补全primary默认库配置(推荐)

在database.yml的每个环境节点下,先声明primary配置作为默认连接,指向你需要的默认库即可:

production:
  primary:
    <<: *default
    database: mi
    host: xxx.xxx.xxx.xxx
    username: test
    password: test
    migrations_paths: db/mi_migrate
  tp:
    <<: *default
    database: tp
    host: xxx.xxx.xxx.xxx
    username: test
    password: test
    migrations_paths: db/tp_migrate

对应的ApplicationRecord可以删除connects_to配置,它会默认继承ActiveRecord::Base的primary连接,TpBase保留原有connects_to配置即可。

方案2:启动时预加载所有数据库连接

如果确实不需要primary配置,可以新增初始化文件config/initializers/database_connections.rb,强制Rails启动时建立所有配置的数据库连接:

Rails.application.config.after_initialize do
  ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
    ActiveRecord::Base.connection_handler.establish_connection(db_config.name.to_sym)
  end
end

额外修正

你servant.rb中的类名使用了小写的class servant,不符合Ruby类名驼峰命名规范,Linux生产环境大小写敏感可能会导致常量加载异常,建议修正为class Servant < TpBase。

内容的提问来源于stack exchange,提问作者2017kamb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:54:03