【问题标题】:How does a rails model get connected to the appropriate table in a database?rails 模型如何连接到数据库中的适当表?
【发布时间】:2016-03-08 15:59:24
【问题描述】:

rails模型内部是使用ActiveRecord::ConnectionAdapters::ConnectionHandler#establish_connection方法连接数据库,还是有其他机制?

如果我在模型中写入establish_connection 以连接到不同的数据库, 每次在该模型的数据库中触发 sql 查询时,它会建立一个新连接,还是相同的连接会持续存在?

我有点困惑,请解释一下。

【问题讨论】:

    标签: ruby-on-rails ruby database ruby-on-rails-4 activerecord


    【解决方案1】:

    是的,与数据库的连接是通过ActiveRecord::Base.establish_connection 创建并由ActiveRecord::Base.connection 检索的。从 ActiveRecord::Base 继承的所有类都使用此连接。如果您希望某些模型使用不同的连接,您可以添加特定于类的连接。假设您需要访问除 Rails 应用程序使用的数据库之外的遗留数据库中的数据。您要做的是创建一个新的基类,可供希望访问该遗留数据的模型使用。例如:

        class LegacyProjectBase < ActiveRecord::Base
          establish_connection :other_database_you_want_to_connect_to
          self.abstract_class
          ........whatever else
        end
    

    您需要添加 self.abstract_class=true 位才能使其与子类一起使用。

    对于第二个问题,我相当肯定 Rails 在这样做时不会在查询时重新创建连接,因为 Rails 将数据库连接保存在 ActiveRecord::Base 类实例内的连接池中。连接池只是一个由 Active Record 索引的哈希对象。在执行过程中,当需要连接时,“retrieve_connection”方法会向上遍历类层次结构,直到找到匹配的连接。

    【讨论】:

    • 一个rake任务每次运行都会加载rails环境,现在这个模型每次运行都会创建到数据库的连接,之前的连接会怎样?
    • 请更新答案并尽可能提供权威参考。
    • “Rails4way”这本书有一些信息。对此。如果您想确定在不使用时没有多个连接保持打开状态,您可以使用断开连接!完成每个 rake 任务后关闭活动连接的方法,或使用“活动?”检查连接是否保持打开状态。方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2014-05-26
    • 1970-01-01
    • 2020-11-12
    • 2012-02-02
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多