Module: Apartment
- Extended by:
- Forwardable
- Defined in:
- lib/apartment.rb,
lib/apartment/model.rb,
lib/apartment/tenant.rb,
lib/apartment/railtie.rb,
lib/apartment/version.rb,
lib/apartment/migrator.rb,
lib/apartment/deprecation.rb,
lib/apartment/custom_console.rb,
lib/apartment/elevators/host.rb,
lib/apartment/log_subscriber.rb,
lib/apartment/elevators/domain.rb,
lib/apartment/elevators/generic.rb,
lib/apartment/tasks/task_helper.rb,
lib/apartment/tasks/enhancements.rb,
lib/apartment/elevators/host_hash.rb,
lib/apartment/elevators/subdomain.rb,
lib/apartment/tasks/schema_dumper.rb,
lib/apartment/adapters/mysql2_adapter.rb,
lib/apartment/adapters/postgis_adapter.rb,
lib/apartment/adapters/sqlite3_adapter.rb,
lib/apartment/adapters/trilogy_adapter.rb,
lib/apartment/adapters/abstract_adapter.rb,
lib/apartment/elevators/first_subdomain.rb,
lib/apartment/adapters/jdbc_mysql_adapter.rb,
lib/apartment/adapters/postgresql_adapter.rb,
lib/apartment/adapters/abstract_jdbc_adapter.rb,
lib/apartment/adapters/jdbc_postgresql_adapter.rb,
lib/generators/apartment/install/install_generator.rb
Overview
Require this file to append Apartment rake tasks to ActiveRecord db rake tasks Enabled by default in the initializer
Defined Under Namespace
Modules: Adapters, CustomConsole, Elevators, Migrator, Model, PostgreSqlAdapterPatch, TaskHelper, Tasks, Tenant Classes: InstallGenerator, LogSubscriber, Railtie, RakeTaskEnhancer
Constant Summary collapse
- ACCESSOR_METHODS =
%i[use_schemas use_sql seed_after_create prepend_environment default_tenant append_environment with_multi_server_setup tenant_presence_check active_record_log pg_exclude_clone_tables].freeze
- WRITER_METHODS =
%i[tenant_names database_schema_file excluded_models persistent_schemas connection_class db_migrate_tenants db_migrate_tenant_missing_strategy seed_data_file parallel_migration_threads pg_excluded_names parallel_strategy manage_advisory_locks].freeze
- ApartmentError =
Exceptions
Class.new(StandardError)
- AdapterNotFound =
Raised when apartment cannot find the adapter specified in
config/database.yml Class.new(ApartmentError)
- FileNotFound =
Raised when apartment cannot find the file to be loaded
Class.new(ApartmentError)
- TenantNotFound =
Tenant specified is unknown
Class.new(ApartmentError)
- TenantExists =
The Tenant attempting to be created already exists
Class.new(ApartmentError)
- VERSION =
'3.4.0'- DEPRECATOR =
ActiveSupport::Deprecation.new(Apartment::VERSION, 'Apartment')
Class Method Summary collapse
-
.configure {|_self| ... } ⇒ Object
configure apartment with available options.
- .connection_class ⇒ Object
- .connection_config ⇒ Object
- .database_schema_file ⇒ Object
- .db_config_for(tenant) ⇒ Object
-
.db_migrate_tenant_missing_strategy ⇒ Object
How to handle missing tenants during db:migrate :rescue_exception (default) - Log error, continue with other tenants :raise_exception - Stop migration immediately :create_tenant - Automatically create missing tenant and migrate.
-
.db_migrate_tenants ⇒ Object
Whether or not db:migrate should also migrate tenants defaults to true.
-
.excluded_models ⇒ Object
Default to empty array.
- .extract_tenant_config ⇒ Object
-
.manage_advisory_locks ⇒ Object
Whether to manage PostgreSQL advisory locks during parallel migrations When true and parallel_migration_threads > 0, advisory locks are disabled during migration to prevent deadlocks, then restored afterward.
- .parallel_migration_threads ⇒ Object
-
.parallel_strategy ⇒ Object
Parallelism strategy for migrations :auto (default) - Detect platform: processes on Linux, threads on macOS/Windows :threads - Always use threads (safer, works everywhere) :processes - Always use processes (faster on Linux, may crash on macOS/Windows).
- .persistent_schemas ⇒ Object
- .pg_excluded_names ⇒ Object
-
.reset ⇒ Object
Reset all the config for Apartment.
- .seed_data_file ⇒ Object
- .tenant_names ⇒ Object
- .tenants_with_config ⇒ Object
- .tld_length=(_) ⇒ Object
Class Method Details
.configure {|_self| ... } ⇒ Object
configure apartment with available options
44 45 46 |
# File 'lib/apartment.rb', line 44 def configure yield(self) if block_given? end |
.connection_class ⇒ Object
119 120 121 |
# File 'lib/apartment.rb', line 119 def connection_class @connection_class || ActiveRecord::Base end |
.connection_config ⇒ Object
39 40 41 |
# File 'lib/apartment.rb', line 39 def connection_config connection_db_config.configuration_hash end |
.database_schema_file ⇒ Object
123 124 125 126 127 |
# File 'lib/apartment.rb', line 123 def database_schema_file return @database_schema_file if defined?(@database_schema_file) @database_schema_file = Rails.root.join('db/schema.rb') end |
.db_config_for(tenant) ⇒ Object
60 61 62 |
# File 'lib/apartment.rb', line 60 def db_config_for(tenant) tenants_with_config[tenant] || connection_config end |
.db_migrate_tenant_missing_strategy ⇒ Object
How to handle missing tenants during db:migrate :rescue_exception (default) - Log error, continue with other tenants :raise_exception - Stop migration immediately :create_tenant - Automatically create missing tenant and migrate
76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/apartment.rb', line 76 def db_migrate_tenant_missing_strategy valid = %i[rescue_exception raise_exception create_tenant] value = @db_migrate_tenant_missing_strategy || :rescue_exception return value if valid.include?(value) key_name = 'config.db_migrate_tenant_missing_strategy' opt_names = valid.join(', ') raise(ApartmentError, "Option #{value} not valid for `#{key_name}`. Use one of #{opt_names}") end |
.db_migrate_tenants ⇒ Object
Whether or not db:migrate should also migrate tenants defaults to true
66 67 68 69 70 |
# File 'lib/apartment.rb', line 66 def db_migrate_tenants return @db_migrate_tenants if defined?(@db_migrate_tenants) @db_migrate_tenants = true end |
.excluded_models ⇒ Object
Default to empty array
89 90 91 |
# File 'lib/apartment.rb', line 89 def excluded_models @excluded_models || [] end |
.extract_tenant_config ⇒ Object
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/apartment.rb', line 146 def extract_tenant_config return {} unless @tenant_names # Execute callable (proc/lambda) to get dynamic tenant list from database values = @tenant_names.respond_to?(:call) ? @tenant_names.call : @tenant_names # Normalize arrays to hash format (tenant_name => connection_config) unless values.is_a?(Hash) values = values.index_with do |_tenant| connection_config end end values.with_indifferent_access rescue ActiveRecord::StatementInvalid # Database query failed (table doesn't exist yet, connection issue) # Return empty hash to allow app to boot without tenants {} end |
.manage_advisory_locks ⇒ Object
Whether to manage PostgreSQL advisory locks during parallel migrations When true and parallel_migration_threads > 0, advisory locks are disabled during migration to prevent deadlocks, then restored afterward. Default: true
109 110 111 112 113 |
# File 'lib/apartment.rb', line 109 def manage_advisory_locks return @manage_advisory_locks if defined?(@manage_advisory_locks) @manage_advisory_locks = true end |
.parallel_migration_threads ⇒ Object
93 94 95 |
# File 'lib/apartment.rb', line 93 def parallel_migration_threads @parallel_migration_threads || 0 end |
.parallel_strategy ⇒ Object
Parallelism strategy for migrations :auto (default) - Detect platform: processes on Linux, threads on macOS/Windows :threads - Always use threads (safer, works everywhere) :processes - Always use processes (faster on Linux, may crash on macOS/Windows)
101 102 103 |
# File 'lib/apartment.rb', line 101 def parallel_strategy @parallel_strategy || :auto end |
.persistent_schemas ⇒ Object
115 116 117 |
# File 'lib/apartment.rb', line 115 def persistent_schemas @persistent_schemas || [] end |
.pg_excluded_names ⇒ Object
135 136 137 |
# File 'lib/apartment.rb', line 135 def pg_excluded_names @pg_excluded_names || [] end |
.reset ⇒ Object
Reset all the config for Apartment
140 141 142 143 144 |
# File 'lib/apartment.rb', line 140 def reset (ACCESSOR_METHODS + WRITER_METHODS).each do |method| remove_instance_variable(:"@#{method}") if instance_variable_defined?(:"@#{method}") end end |
.seed_data_file ⇒ Object
129 130 131 132 133 |
# File 'lib/apartment.rb', line 129 def seed_data_file return @seed_data_file if defined?(@seed_data_file) @seed_data_file = Rails.root.join('db/seeds.rb') end |
.tenant_names ⇒ Object
48 49 50 |
# File 'lib/apartment.rb', line 48 def tenant_names extract_tenant_config.keys.map(&:to_s) end |
.tenants_with_config ⇒ Object
52 53 54 |
# File 'lib/apartment.rb', line 52 def tenants_with_config extract_tenant_config end |
.tld_length=(_) ⇒ Object
56 57 58 |
# File 'lib/apartment.rb', line 56 def tld_length=(_) Apartment::DEPRECATOR.warn('`config.tld_length` have no effect because it was removed in https://github.com/influitive/apartment/pull/309') end |