Disable multi-db for SQLite
This commit is contained in:
@@ -1,12 +1,7 @@
|
|||||||
class ApplicationRecord < ActiveRecord::Base
|
class ApplicationRecord < ActiveRecord::Base
|
||||||
primary_abstract_class
|
primary_abstract_class
|
||||||
|
|
||||||
# SQLite doesn't use separate replica databases
|
configure_replica_connections
|
||||||
if ENV.fetch("DATABASE_ADAPTER", "mysql") == "sqlite"
|
|
||||||
connects_to database: { writing: :primary, reading: :primary }
|
|
||||||
else
|
|
||||||
connects_to database: { writing: :primary, reading: :replica }
|
|
||||||
end
|
|
||||||
|
|
||||||
attribute :id, :uuid, default: -> { ActiveRecord::Type::Uuid.generate }
|
attribute :id, :uuid, default: -> { ActiveRecord::Type::Uuid.generate }
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -4,14 +4,8 @@ ActiveSupport.on_load(:active_storage_blob) do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Use DB read/write splitting for Active Storage models
|
|
||||||
ActiveSupport.on_load(:active_storage_record) do
|
ActiveSupport.on_load(:active_storage_record) do
|
||||||
# SQLite doesn't use separate replica databases
|
configure_replica_connections
|
||||||
if ENV.fetch("DATABASE_ADAPTER", "mysql") == "sqlite"
|
|
||||||
connects_to database: { writing: :primary, reading: :primary }
|
|
||||||
else
|
|
||||||
connects_to database: { writing: :primary, reading: :replica }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module ActiveStorageControllerExtensions
|
module ActiveStorageControllerExtensions
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
require_relative "extensions"
|
||||||
|
|
||||||
class DatabaseRoleLogger
|
class DatabaseRoleLogger
|
||||||
def initialize(app)
|
def initialize(app)
|
||||||
@app = app
|
@app = app
|
||||||
@@ -10,4 +12,6 @@ class DatabaseRoleLogger
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Rails.application.config.middleware.insert_after ActiveRecord::Middleware::DatabaseSelector, DatabaseRoleLogger
|
if ActiveRecord::Base.replica_configured?
|
||||||
|
Rails.application.config.middleware.insert_after ActiveRecord::Middleware::DatabaseSelector, DatabaseRoleLogger
|
||||||
|
end
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
require "deployment"
|
require "deployment"
|
||||||
|
require_relative "extensions"
|
||||||
|
|
||||||
Rails.application.configure do
|
if ActiveRecord::Base.replica_configured?
|
||||||
config.active_record.database_selector = { delay: 1.second }
|
Rails.application.configure do
|
||||||
config.active_record.database_resolver = Deployment::DatabaseResolver
|
config.active_record.database_selector = { delay: 1.second }
|
||||||
config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
|
config.active_record.database_resolver = Deployment::DatabaseResolver
|
||||||
|
config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -43,6 +43,4 @@ module AccountSlug
|
|||||||
def self.encode(id) FORMAT % id end
|
def self.encode(id) FORMAT % id end
|
||||||
end
|
end
|
||||||
|
|
||||||
Rails.application.config.middleware.tap do |stack|
|
Rails.application.config.middleware.insert_after Rack::TempfileReaper, AccountSlug::Extractor
|
||||||
stack.insert_before ActiveRecord::Middleware::DatabaseSelector, AccountSlug::Extractor
|
|
||||||
end
|
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Adds a helper method to check if replica database connections are configured
|
||||||
|
# and automatically configures read/write splitting when replicas are available.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# class ApplicationRecord < ActiveRecord::Base
|
||||||
|
# configure_replica_connections
|
||||||
|
# end
|
||||||
|
module ActiveRecordReplicaSupport
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
class_methods do
|
||||||
|
# Automatically configures connects_to for read/write splitting if a replica
|
||||||
|
# database is configured for the current environment. This is a no-op if no
|
||||||
|
# replica configuration exists.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# class ApplicationRecord < ActiveRecord::Base
|
||||||
|
# configure_replica_connections
|
||||||
|
# end
|
||||||
|
def configure_replica_connections
|
||||||
|
if replica_configured?
|
||||||
|
connects_to database: { writing: :primary, reading: :replica }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns true if a replica database configuration exists for the current
|
||||||
|
# environment. This allows different database adapters to opt in or out of
|
||||||
|
# read/write splitting based on their database.yml configuration.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# ApplicationRecord.replica_configured? # => true for MySQL, false for SQLite
|
||||||
|
def replica_configured?
|
||||||
|
configurations.find_db_config("replica").present?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveRecord::Base.include ActiveRecordReplicaSupport
|
||||||
Reference in New Issue
Block a user