覆盖database.yml的策略

时间:2011-02-01 12:28:22

标签: ruby-on-rails ruby activerecord yaml erb

有关此标题的stackoverflow还有另一个问题。这是link。我的问题有点不同,但几乎在同一条线上

我使用的数据库有多个用户,每个用户都拥有一组唯一的数据库权限。因此,我无法在database.yml中硬编码数据库登录详细信息。相反,我想创建一个收集登录凭据的html表单。我知道database.yml可以从这个link以erb方式编写。但是到了那时,我的index.html(我编写了我的表单的页面)显示了,建立连接的尝试已经完成,并且发出错误,提示用户名和密码为nil。请让我知道如何解决这个问题。

我是rails的新手,所以请问我是否提供了足够的信息。提前致谢

1 个答案:

答案 0 :(得分:3)

使用ActiveRecord::ConnectionHandling.establish_connection函数调用连接到您的数据库。如果您愿意,您应该能够与每个页面上的其他用户建立连接,或者在用户模型中查找数据库凭据。

如果您这样做,您可以考虑继承ActiveRecord::Base并重写connection调用,然后每个模型都会使用它来连接数据库。

如果要在通过应用程序显式设置凭据之前完全避免与数据库的连接,那么您可能希望在不加载所有ActiveRecord特定内容的情况下初始化Rails。在这种情况下,您需要通过在config/environment.rb块中的Rails::Initializer.run do |config|中放置此行来从Rails的初始化中删除ActiveRecord:

config.frameworks -= [ :active_record ]

然后,您需要在获得凭据后加载所有ActiveRecord特定的内容。

或者,您可以通过在Rails::Initialize::initialize_database调用之前将其放在environment.rb中来覆盖Rails::Initializer.run,这是实际数据库连接的使用位置:

module Rails
  class Initializer
    def initialize_database
      nil
    end
  end
end

在rails 4.x之前,您将使用ActiveRecord::Base.establish_connection,现已弃用。