From 915c1202f873534431bbf1d0a6138cbe861853d0 Mon Sep 17 00:00:00 2001 From: Kevin McConnell Date: Tue, 11 Nov 2025 15:06:18 +0000 Subject: [PATCH] Initial minimal primary/replica switching --- app/models/application_record.rb | 2 ++ config/database.yml | 8 ++++++++ config/environments/development.rb | 3 +++ config/initializers/database_role_logging.rb | 13 +++++++++++++ config/initializers/multi_db.rb | 5 +++++ 5 files changed, 31 insertions(+) create mode 100644 config/initializers/database_role_logging.rb create mode 100644 config/initializers/multi_db.rb diff --git a/app/models/application_record.rb b/app/models/application_record.rb index b63caeb8a..f0814baa6 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -1,3 +1,5 @@ class ApplicationRecord < ActiveRecord::Base primary_abstract_class + + connects_to database: { writing: :primary, reading: :replica } end diff --git a/config/database.yml b/config/database.yml index 2431e23ea..513794386 100644 --- a/config/database.yml +++ b/config/database.yml @@ -9,6 +9,10 @@ development: primary: <<: *default database: fizzy_development + replica: + <<: *default + database: fizzy_development + replica: true cable: <<: *default database: development_cable @@ -29,6 +33,10 @@ test: primary: <<: *default database: fizzy_test + replica: + <<: *default + database: fizzy_test + replica: true production: &production primary: diff --git a/config/environments/development.rb b/config/environments/development.rb index a87ef7843..f4b10a3f0 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -73,6 +73,9 @@ Rails.application.configure do # Raise error when a before_action's only/except options reference missing actions config.action_controller.raise_on_missing_callback_actions = true + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + if Rails.root.join("tmp/email-dev.txt").exist? config.action_mailer.delivery_method = :letter_opener config.action_mailer.perform_deliveries = true diff --git a/config/initializers/database_role_logging.rb b/config/initializers/database_role_logging.rb new file mode 100644 index 000000000..698d52080 --- /dev/null +++ b/config/initializers/database_role_logging.rb @@ -0,0 +1,13 @@ +class DatabaseRoleLogger + def initialize(app) + @app = app + end + + def call(env) + Rails.logger.tagged(ActiveRecord::Base.current_role.to_s) do + @app.call(env) + end + end +end + +Rails.application.config.middleware.insert_after ActiveRecord::Middleware::DatabaseSelector, DatabaseRoleLogger diff --git a/config/initializers/multi_db.rb b/config/initializers/multi_db.rb new file mode 100644 index 000000000..ae85d8527 --- /dev/null +++ b/config/initializers/multi_db.rb @@ -0,0 +1,5 @@ +Rails.application.configure do + config.active_record.database_selector = { delay: 1.second } + config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session +end