跳到內容 跳到搜尋

Active Record 資料庫設定

ActiveRecord::DatabaseConfigurations 傳回一個陣列,此陣列包含從應用程式的資料庫設定雜湊值或 URL 字串建置而成的 DatabaseConfig 物件。

應用程式中的 DatabaseConfig 物件陣列預設會設為 HashConfigUrlConfig。你可以使用 ActiveRecord::Base.configurations 來取得應用程式的設定。

如果你註冊自訂處理常式,則會根據處理常式的條件來建立物件。請參閱 ::register_db_config_handler 以取得註冊自訂處理常式的詳細資料。

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

屬性

[R] configurations

類別公開方法

new(configurations = {})

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

register_db_config_handler(&block)

允許應用程式註冊自訂處理常式,以針對資料庫設定物件進行處理。這對於建立自訂處理常式非常有用,該處理常式可以回應應用程式需要但 Active Record 沒有執行的某些方法。例如,如果你正在使用 Vitess,你可能希望 Vitess 設定可以回應「已分片」的狀況。若要執行此動作,請在初始化程式中定義下列內容:

ActiveRecord::DatabaseConfigurations.register_db_config_handler do |env_name, name, url, config|
  next unless config.key?(:vitess)
  VitessConfig.new(env_name, name, config)
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 61
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 98
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 150
def empty?
  configurations.empty?
end

find_db_config(env)

傳回單一 DatabaseConfig 物件,物件會根據要求的環境建立。

如果應用程式有多個資料庫,find_db_config 會傳回環境的第一個 DatabaseConfig

# File activerecord/lib/active_record/database_configurations.rb, line 127
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