2017-09-09 32 views
0

我测试了备份宝石备份宝石我怎么可以从轨道的database.yml

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"))) 

但我想应该有更好的办法。

回答

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 
    # ... 
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']作为用户名,密码和其他所有内容。

环境变化很容易在部署之间切换而不需要更改任何 代码;与配置文件不同,它们几乎不可能被 意外检入代码回购;并且与自定义配置 文件或其他配置机制(如Java系统属性)不同,它们 是与语言和操作系统无关的标准。
- https://12factor.net/config

参见: