Rails 6+多数据库场景下,如何为指定控制器方法显式调用写库实例?
Rails 6+ 多数据库环境下控制器指定方法使用写库的方案
Rails 并不支持你示例中那种直接在控制器顶部指定角色的写法,但可以通过控制器的around_action过滤器实现等价效果,把指定动作的所有数据库操作都包裹在写库连接环境中。
具体实现代码
class InvitedUsersController < ApplicationController # 指定仅index、show动作使用写库 around_action :use_writing_database, only: [:index, :show] def index # 此方法内的所有数据库操作(包括Devise的session表INSERT)都会使用写库 end def show # 同理,整个方法执行期间绑定写库连接 end private def use_writing_database # 用写库连接包裹控制器动作的执行逻辑 ActiveRecord::Base.connected_to(role: :writing) do yield end end end
关键说明
- around_action的作用:它会把指定控制器方法的全部执行逻辑包裹在
connected_to块内部,确保整个动作生命周期内的所有ActiveRecord操作都使用写库连接,完美解决你页面中Devise需要写入session表的场景。 - 多数据库配置匹配:确保你的
database.yml已正确配置角色(role),示例配置如下:
production: primary: url: <%= ENV['DATABASE_URL'] %> role: writing primary_replica: url: <%= ENV['REPLICA_DATABASE_URL'] %> role: reading replica: true
- 灵活调整范围:如果只是动作内某一段代码需要写库,仍可以直接使用你最初了解的
connected_to块写法;但如果整个动作都需要写库,around_action的方式更简洁。
内容的提问来源于stack exchange,提问作者LewlSauce
相关产品推荐
相关产品推荐

