Rails中的多个数据库连接

问题描述:

我在Rails中编写了一个更简单的phpMyAdmin版本;此Web应用程序将运行在Web服务器上(用户将能够指出在同一网络上运行的数据库服务器之一的数据库名称,主机名,用户名,密码和端口号)。然后用户将连接到该机器,并将能够使用UI来管理该数据库(添加或删除列,删除表等)。Rails中的多个数据库连接

我有两个相关的问题(你的帮助将极大地帮助我了解如何最好地处理这个):

  1. 在传统的Rails应用程序我将存储在database.yml中的数据库信息,但是在这里我需要动态地做到这一点。是否有一种很好的方法可以将database.yml文件留空并告诉Rails在运行时使用用户提供的连接数据呢?

  2. 不同的用户可能连接到不同的数据库(甚至主机)。我假设我需要跟踪建立的数据库连接和用户会话之间的关联。达到此目的的最佳方式是什么?

在此先感谢您。

  1. 为了防止滑轨使用的database.yml ActiveRecord的初始化,您可以简单地从config.frameworks中的config/environment.rb中删除:active_record。然后,要手动建立连接,请使用ActiveRecord::Base.establish_connection。 (也许ActiveRecord::Base.configurations

    ActiveRecord存储与类变量相关的所有连接。所以如果你想动态地创建多个连接,你还必须动态地将子类ActiveRecord :: Base和调用establish_connection。

    这将是您将用于实际管理表的任何子类的抽象基类。为了让ActiveRecord知道这一点,你应该在基类定义中做self.abstract_class = true

    然后,您要管理的每个表将依次动态地将这个新的抽象基类继承下来。

  2. 这比较困难,因为当然你不能真正坚持连接。我能想到的直接解决方案是在会话中存储唯一的令牌,并在before_filter中使用该令牌返回动态ActiveRecord :: Base子类,您可能将其存储在某个散列中。

    • 您必须保存所有的会话数据库连接信息,以便其他工作人员可以使用它:

      一旦开始运行多个Rails工作进程这会更有意思。

    • 您可能希望跨工作人员使用一致的唯一标记,因此对数据库连接参数的组合使用散列函数。
    • 由于工作人员可能会使用令牌调用它尚不知道的信息,因此您的子类化和establish_connection逻辑可能会在before_filter中发生。 (例如,而不是登录时刻。)
    • 您将必须找出一些巧妙的垃圾收集连接和类的方法,用于用户未正确注销并且会话过期。 (对不起,我不知道这个。)