Rails 6.1多数据库配置下非主库ApiLog无法创建记录如何解决?
问题根因
Rails 6+ 多数据库规范要求connects_to声明只能放在ActiveRecord::Base或者它的直接子类的抽象类上,你之前的两种写法都违反了规范:
- 加
self.abstract_class = true:抽象类无法被实例化,所以写操作(create/save等)报错 - 去掉
self.abstract_class = true:具体业务模型不允许直接声明connects_to,直接报错
你现有database.yml的多库配置、迁移配置都正确,无需调整,仅需要调整模型层结构即可解决问题。
解决方案
分两步操作:
- 新增api_logs库的抽象基类
在app/models/目录下新建api_logs_base.rb,内容如下:
# frozen_string_literal: true class ApiLogsBase < ApplicationRecord self.abstract_class = true connects_to database: { writing: :api_logs, reading: :api_logs } end
- 修改原ApiLog模型继承该抽象基类
修改app/models/api_log.rb内容如下:
# frozen_string_literal: true class ApiLog < ApiLogsBase # 无需额外配置table_name,Rails会自动根据类名匹配api_logs表 end
验证效果
修改完成后重启服务,即可正常执行读写操作:
- 读操作:
ApiLog.count、ApiLog.first正常返回 - 写操作:
ApiLog.create(method: 'GET', path: '/test')可正常写入api_logs库的对应表
内容的提问来源于stack exchange,提问作者jl118
相关产品推荐
相关产品推荐

