Class: ActiveRecord::DatabaseConfigurations

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/database_configurations.rb,
lib/active_record/database_configurations/url_config.rb,
lib/active_record/database_configurations/hash_config.rb,
lib/active_record/database_configurations/database_config.rb

Overview

ActiveRecord::DatabaseConfigurations returns an array of DatabaseConfig objects (either a HashConfig or UrlConfig) that are constructed from the application's database configuration hash or URL string.

Defined Under Namespace

Classes: DatabaseConfig, HashConfig, InvalidConfigurationError, UrlConfig

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configurations = {}) ⇒ DatabaseConfigurations

Returns a new instance of DatabaseConfigurations.



17
18
19
# File 'lib/active_record/database_configurations.rb', line 17

def initialize(configurations = {})
  @configurations = build_configs(configurations)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &blk) ⇒ Object (private)



201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/active_record/database_configurations.rb', line 201

def method_missing(method, *args, &blk)
  case method
  when :fetch
    throw_getter_deprecation(method)
    configs_for(env_name: args.first)
  when :values
    throw_getter_deprecation(method)
    configurations.map(&:config)
  when :[]=
    throw_setter_deprecation(method)

    env_name = args[0]
    config = args[1]

    remaining_configs = configurations.reject { |db_config| db_config.env_name == env_name }
    new_config = build_configs(env_name => config)
    new_configs = remaining_configs + new_config

    ActiveRecord::Base.configurations = new_configs
  else
    raise NotImplementedError, "`ActiveRecord::Base.configurations` in Rails 6 now returns an object instead of a hash. The `#{method}` method is not supported. Please use `configs_for` or consult the documentation for supported methods."
  end
end

Instance Attribute Details

#configurationsObject (readonly)

Returns the value of attribute configurations.



14
15
16
# File 'lib/active_record/database_configurations.rb', line 14

def configurations
  @configurations
end

Instance Method Details

#configs_for(env_name: nil, spec_name: nil, include_replicas: false) ⇒ Object

Collects the configs for the environment and optionally the specification name passed in. To include replica configurations pass include_replicas: true.

If a spec name is provided a single DatabaseConfig object will be returned, otherwise an array of DatabaseConfig objects will be returned that corresponds with the environment and type requested.

Options

  • env_name: The environment name. Defaults to nil which will collect configs for all environments.

  • spec_name: The specification name (i.e. primary, animals, etc.). Defaults to nil.

  • include_replicas: Determines whether to include replicas in the returned list. Most of the time we're only iterating over the write connection (i.e. migrations don't need to run for the write and read connection). Defaults to false.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/active_record/database_configurations.rb', line 38

def configs_for(env_name: nil, spec_name: nil, include_replicas: false)
  configs = env_with_configs(env_name)

  unless include_replicas
    configs = configs.select do |db_config|
      !db_config.replica?
    end
  end

  if spec_name
    configs.find do |db_config|
      db_config.spec_name == spec_name
    end
  else
    configs
  end
end

#default_hash(env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s) ⇒ Object Also known as: []

Returns the config hash that corresponds with the environment

If the application has multiple databases default_hash will return the first config hash for the environment.

{ database: "my_db", adapter: "mysql2" }


62
63
64
65
# File 'lib/active_record/database_configurations.rb', line 62

def default_hash(env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s)
  default = find_db_config(env)
  default.config if default
end

#eachObject



96
97
98
99
100
101
# File 'lib/active_record/database_configurations.rb', line 96

def each
  throw_getter_deprecation(:each)
  configurations.each { |config|
    yield [config.env_name, config.config]
  }
end

#empty?Boolean Also known as: blank?

Checks if the application's configurations are empty.

Aliased to blank?

Returns:

  • (Boolean)


91
92
93
# File 'lib/active_record/database_configurations.rb', line 91

def empty?
  configurations.empty?
end

#find_db_config(env) ⇒ Object

Returns a single DatabaseConfig object based on the requested environment.

If the application has multiple databases find_db_config will return the first DatabaseConfig for the environment.



72
73
74
75
76
77
# File 'lib/active_record/database_configurations.rb', line 72

def find_db_config(env)
  configurations.find do |db_config|
    db_config.env_name == env.to_s ||
      (db_config.for_current_env? && db_config.spec_name == env.to_s)
  end
end

#firstObject



103
104
105
106
107
# File 'lib/active_record/database_configurations.rb', line 103

def first
  throw_getter_deprecation(:first)
  config = configurations.first
  [config.env_name, config.config]
end

#to_hObject

Returns the DatabaseConfigurations object as a Hash.



80
81
82
83
84
85
86
# File 'lib/active_record/database_configurations.rb', line 80

def to_h
  configs = configurations.reverse.inject({}) do |memo, db_config|
    memo.merge(db_config.to_legacy_hash)
  end

  Hash[configs.to_a.reverse]
end