Rails ActiveAdmin连接切换异常:连接永久切换至归档库求助
解决ActiveAdmin中数据库连接永久切换的问题
你遇到的问题根源在于:使用ActiveRecord::Base.connected_to(database: :archive)时,这个参数会修改全局默认数据库配置,而非仅在代码块内临时切换当前线程的连接。代码块执行完毕后,全局连接并未自动切回主库,导致后续所有查询都指向归档数据库。
解决方案一:使用角色(Role)配置临时切换(推荐)
这种方式利用Rails的多角色连接机制,线程级临时切换,代码块结束后自动恢复原连接,不会影响全局配置。
- 修改
database.yml,添加归档库的角色配置(以开发环境为例):
development: primary: adapter: postgresql database: your_main_db # 其他主库配置(用户名、密码等) archive: adapter: postgresql database: your_archive_db prevent_writes: true # 其他归档库配置(用户名、密码等)
- 更新ActiveAdmin的around_action代码:
# config/initializers/active_admin.rb config.around_action do |controller, action| if session['ARCHIVE'] == 'archive' ActiveRecord::Base.connected_to(role: :archive) do action.call end else action.call end end
解决方案二:手动切回主库(兼容旧版本)
如果无法使用角色配置,可以手动记录原连接,并确保在代码块执行后(无论是否异常)切回主库:
# config/initializers/active_admin.rb config.around_action do |controller, action| if session['ARCHIVE'] == 'archive' original_db_config = ActiveRecord::Base.connection_db_config begin ActiveRecord::Base.connected_to(database: :archive, prevent_writes: true) do action.call end ensure # 强制切回原主库连接 ActiveRecord::Base.connected_to(database: original_db_config.name) end else action.call end end
注意:第二种方法需要确保original_db_config.name对应你主库在database.yml中的配置键名(通常是primary或者主库的直接配置名)。
内容的提问来源于stack exchange,提问作者NeverBe
相关产品推荐
相关产品推荐

