Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 覆盖database.yml的策略?_Ruby On Rails_Ruby_Activerecord_Yaml - Fatal编程技术网

Ruby on rails 覆盖database.yml的策略?

Ruby on rails 覆盖database.yml的策略?,ruby-on-rails,ruby,activerecord,yaml,Ruby On Rails,Ruby,Activerecord,Yaml,在我的环境中,部署服务器拥有database.yml中的大部分连接信息。也就是说,他们知道自己是开发服务器、测试服务器还是生产服务器,并且知道各自的数据库连接信息 例如,我可以将此信息封装在服务器类中,以便检索信息: Server["environment"] #=> production Server["db_host"] #=> db5.example.com Server["db_password"] #=> [a decrypted password] 等等。我想部署

在我的环境中,部署服务器拥有database.yml中的大部分连接信息。也就是说,他们知道自己是开发服务器、测试服务器还是生产服务器,并且知道各自的数据库连接信息

例如,我可以将此信息封装在服务器类中,以便检索信息:

Server["environment"] #=> production
Server["db_host"] #=> db5.example.com
Server["db_password"] #=> [a decrypted password]
等等。我想部署一个Rails应用程序,并根据服务器设置进行自动配置。最好的方法是什么

一种方法是在my database.yml中使用Erb:

<%= Server["environment"] %>: 
  adapter: oracle_enhanced
  host: <%= Server["db_host"] %>
  username: db_user 
  password: <%= Server["password"] %>
只有在config.frameworks中定义了:active_record时,才会调用上述函数。我不确定如何在Rails启动序列中足够早地覆盖它

也许第三种选择是:从config.frameworks中删除active_记录,然后稍后创建连接,比如在应用程序初始值设定项中?恐怕这会有很多意想不到的副作用


我希望有一些简单而明显的东西我还没有找到,比如一个ActiveRecord功能,它允许我选择退出database.yml并以编程方式提供备用配置。

这里有两个技巧可能会有所帮助。一个是您所接触到的,即对数据库配置中加载的例程进行猴子补丁,这当然是值得探索的。Ruby的好处在于,你可以修补任何你不喜欢的东西,并用更好的东西来代替它。这里的问题是,较新版本的Rails可能会使用不同的配置机制,而您的补丁将导致所有问题都被破坏。也许这是值得付出的代价


另一种方法是将
database.yml
文件保存在服务器上而不是存储库中,并使用某种部署脚本将其链接到适当的位置。这种方法的优点是,您的版本控制系统中没有重要的密码,您可以更新服务器配置,而无需修补应用程序。

您可以直接在应用程序中提供自己的数据库自定义设置。rb: 它似乎在rails 3.2中运行良好。(但要注意,这是一种猴子修补术)

模块MyApp
类应用程序
这似乎在Rails 3.2.2中起作用

module MyApp 
  class Application < Rails::Application
    self.paths['config/database'] = 'config/another_db.yml'
  end
end
模块MyApp
类应用程序
这是一个老问题,但在Rails 4中,您只需使用一个环境变量,并拥有一个空白或缺少的database.yml(
database\u URL
将覆盖任何database.yml)

DATABASE\u URL=postgres://myuser:mypass@myposgresbox.com:5432/我的数据库名称


更多信息:

我对内置解决方案的希望破灭了。显然,几年前Rails核心团队就一个补丁进行了讨论,该补丁为database.yml提供了一个ruby替代品,它得到了一些支持,但遭到了拒绝。注意:从Rails 3.1.2开始,
database\u configuration
方法位于
Rails::Application::configuration
中。在以前的版本中,它位于
Rails::Configuration
中。总有一个预初始化器,可以用来加载服务器类,并从database.yml使用它。@François,这很有趣。我不知道预初始化器的事。谢谢你知道我在哪里可以下载到猴子补丁ActiveRecord吗?我必须在AR加载之后但在连接之前这样做。由于
config/preinitializer.rb
被弃用,这种事情的官方方法是在
config/application.rb
之后立即将你的钩子放到
require“rails/all”
上,投票给其他方法谢谢,这是指向另一个database.yml的简单方法。然而,在我的例子中,它并没有给我带来太多的好处,因为我不想要硬编码的东西(特别是生产密码),所以我仍然需要Erb。在我的例子中,我为不同的环境设置了不同的.yml。我仍然喜欢在文件中配置文件,其中一些文件可能在我的源repo中(即使用sqlite3进行开发),但在服务器上手动配置生产。谢谢。在application.rb中添加
self.paths['config/database']='config/other_db.yml'
对Rails3有效。这非常有效。我正在开发的一个应用程序必须在Ubuntu上运行(通过Vagrant),但我经常想在开发时在OSX上运行它。因此,一个简单的
ENV
签入
config/environments/development.rb
非常适合在OSXHere的
Rails::path::Root
类的文档中运行数据库配置,其中
Rails.application.Paths
(或上文提到的
self.Paths
)是一个实例:-下面是默认路径的列表:在ruby1.9.3之前一直工作,然后我更新到Ruby2.3.x,它的抛出错误表示无法在NoMethodError上调用super:super:no超类方法“database_configuration”。我将就此提出一个问题这就是我需要的devops用例
module MyApp 
  class Application < Rails::Application
    # ... config 
    config.encoding = "utf-8" 

    def config.database_configuration
      parsed = super
      raise parsed.to_yaml  # Replace this line to add custom connections to the hash from database.yml
    end
  end
end
module MyApp 
  class Application < Rails::Application
    self.paths['config/database'] = 'config/another_db.yml'
  end
end