跳至内容 跳至搜索

Active Record 数据库配置

ActiveRecord::DatabaseConfigurations 返回一个由应用程序的数据库配置哈希或 URL 字符串构造的 DatabaseConfig 对象数组。

应用程序中的 DatabaseConfig 对象数组默认为 HashConfigUrlConfig。您可以通过使用 ActiveRecord::Base.configurations 来检索应用程序的配置。

如果您注册了一个自定义处理程序,对象将根据处理程序的条件进行创建。有关注册自定义处理程序的更多信息,请参阅 ::register_db_config_handler

命名空间
方法
B
C
E
F
N
R

Attributes

[R] configurations

类公共方法

new(configurations = {})

# File activerecord/lib/active_record/database_configurations.rb, line 75
def initialize(configurations = {})
  @configurations = build_configs(configurations)
end

register_db_config_handler(&block)

允许应用程序为数据库配置对象注册自定义处理程序。这对于创建响应应用程序所需方法但 Active Record 未实现的自定义处理程序很有用。例如,如果您正在使用 Vitess,您可能希望您的 Vitess 配置响应 `sharded?`。要实现这一点,请在初始化程序中定义以下内容:

ActiveSupport.on_load(:active_record_database_configurations) do
  ActiveRecord::DatabaseConfigurations.register_db_config_handler do |env_name, name, url, config|
    next unless config.key?(:vitess)
    VitessConfig.new(env_name, name, config)
  end
end

注意:应用程序必须在您的处理程序注册中处理何时应创建自定义配置的条件,否则所有对象都将使用自定义处理程序。

然后定义您的 VitessConfig 以响应您的应用程序所需的方法。建议您继承现有的数据库配置类之一,以避免重新实现所有方法。自定义配置处理程序应仅实现 Active Record 未实现的方法。

class VitessConfig < ActiveRecord::DatabaseConfigurations::UrlConfig
  def sharded?
    configuration_hash.fetch("sharded", false)
  end
end

对于具有 :vitess 键的配置,将创建一个 VitessConfig 对象而不是 UrlConfig 对象。

# File activerecord/lib/active_record/database_configurations.rb, line 63
def self.register_db_config_handler(&block)
  db_config_handlers << block
end

实例公共方法

blank?()

别名: empty?

configs_for(env_name: nil, name: nil, config_key: nil, include_hidden: false)

收集环境中指定配置名称(可选)的配置。要包含副本配置,请传递 include_hidden: true

如果提供了名称,将返回单个 DatabaseConfig 对象,否则将返回与请求的环境和类型相对应的 DatabaseConfig 对象数组。

选项

  • env_name: 环境名称。默认为 nil,将收集所有环境的配置。

  • name: 数据库配置名称(例如,primary, animals 等)。默认为 nil。如果未指定 env_name,将返回默认环境和传入的 name 的配置。

  • config_key: 选择包含配置哈希中特定键的配置。这对于选择使用自定义数据库配置处理程序或查找包含特定键的哈希的配置很有用。

  • include_hidden: 确定返回的列表中是否包含副本配置和由 database_tasks: false 隐藏的配置。大多数时候,我们只迭代主连接(即,迁移不需要为写入和读取连接运行)。默认为 false

# File activerecord/lib/active_record/database_configurations.rb, line 100
def configs_for(env_name: nil, name: nil, config_key: nil, include_hidden: false)
  env_name ||= default_env if name
  configs = env_with_configs(env_name)

  unless include_hidden
    configs = configs.select do |db_config|
      db_config.database_tasks?
    end
  end

  if config_key
    configs = configs.select do |db_config|
      db_config.configuration_hash.key?(config_key)
    end
  end

  if name
    configs.find do |db_config|
      db_config.name == name.to_s
    end
  else
    configs
  end
end

empty?()

检查应用程序的配置是否为空。

也别名为: blank?
# File activerecord/lib/active_record/database_configurations.rb, line 152
def empty?
  configurations.empty?
end

find_db_config(env)

根据请求的环境返回单个 DatabaseConfig 对象。

如果应用程序有多个数据库,find_db_config 将返回该环境的第一个 DatabaseConfig 对象。

# File activerecord/lib/active_record/database_configurations.rb, line 129
def find_db_config(env)
  env = env.to_s
  configurations.find do |db_config|
    db_config.for_current_env? && (db_config.env_name == env || db_config.name == env)
  end || configurations.find do |db_config|
    db_config.env_name == env
  end
end