我正在测试备用宝石
http://backup.github.io/backup/v4/utilities/
我知道我要创建一个带有配置的db_backup.rb,例如
Model.new(:my_backup, 'My Backup') do
database MySQL do |db|
# To dump all databases, set `db.name = :all` (or leave blank)
db.name = "my_database_name"
db.username = "my_username"
db.password = "my_password"
db.host = "localhost"
db.port = 3306
但是我无法找到如何从Rails database.yml
获取这些详细信息。我尝试过这样的事情:
env = defined?(RAILS_ENV) ? RAILS_ENV : 'development'
@settings = YAML.load(File.read(File.join( "config", "database.yml")))
但我想应该有更好的方法。
答案 0 :(得分:1)
我会做这样的事情:
env = defined?(RAILS_ENV) ? RAILS_ENV : 'development'
config = YAML.load_file(File.join('config', 'database.yml'))[env]
Model.new(:my_backup, 'My Backup') do
database MySQL do |db|
config.each_pair do |key, value|
db.public_send("#{key}=", value)
end
# ...
答案 1 :(得分:0)
使用ActiveRecord自己的配置处理:
require 'active_record'
require 'yaml'
Model.new(:my_backup, 'My Backup') do
database MySQL do |db|
config = {
# these are the default values
host: 'localhost'
port: 3306
}.merge(load_configuration(ENV['RAILS_ENV'] || 'development'))
config.each_pair do |key, value|
db.public_send("#{key}=", value)
end
end
# this loads the configuration from file and memoizes it
def load_configuration(env)
@file_config ||= YAML.load(File.read(File.join( "config", "database.yml")))
@configurations ||= ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(file_config).resolve
@configurations[env]
end
end
这里的关键优势是它将合并来自ENV['DATABASE_URL']
的值。这是非常重要的,因为您应该避免将数据库凭据添加到config/database.yml
。
一个好习惯是在database.yml
中仅指定连接适配器和基本要素。使用ENV['DATABASE_URL']
获取用户名,密码和其他所有内容。
Env vars很容易在部署之间进行更改,而无需更改任何部分 码;与配置文件不同,它们几乎没有机会 不小心检查了代码回购;和自定义配置不同 文件或其他配置机制,如Java系统属性,它们 是一种与语言和操作系统无关的标准 - https://12factor.net/config
请参阅: