ActiveRecord :: ConnectionNotEstablished错误(急切加载?)

时间:2011-10-13 14:32:40

标签: ruby activerecord eager-loading ubuntu-11.04

我正在开发OSX并在Linux上进行部署。我的环境是:

发展:

OSX Lion
Ruby 1.9.2p180
ActiveRecord 3.0.9
PostgreSQL 9.0

测试:

Ubuntu Server 11.04
Ruby 1.9.2p290
ActiveRecord 3.1.1
PostgreSQL 9.1

以下代码可以在OSX上运行,但不适用于Linux:

ei_doc_type = TaxDoc::Model::DocType.find_by_doc_type("EI")
doc_version = ei_doc_type.doc_versions.find_by_doc_version(edoc.version)
customer.electronic_invoices.create(....)

ei_doc_type = TaxDoc::Model::DocType.find_by_doc_type("EI")
ei_doc_type.doc_versions.each { |doc_version|
  @mappings[doc_version.doc_version] = Hash.new
  doc_version.mappings.each { |mapping|
    @mappings[doc_version.doc_version][mapping.column_name] = mapping.xml_element
  }
}

当我尝试在Linux中运行任何这些代码时,我收到以下错误:

.../connection_pool.rb:409: in `retrieve_connection': ActiveRecord::ConnectionNotEstablished (ActiveRecord::ConnectionNotEstablished)

我更改了代码,它适用于Linux:

ei_doc_type = TaxDoc::Model::DocType.find_by_doc_type("EI")
doc_versions = TaxDoc::Model::DocVersion.where(:doc_type_id => ei_doc_type.id, :doc_version => edoc.version)
doc_version = doc_version.first
customer.electronic_invoices.create(....)

ei_doc_type = TaxDoc::Model::DocType.includes(:doc_versions => :mappings).find_by_doc_type("EI")
ei_doc_type.doc_versions.each { |doc_version|
  @mappings[doc_version.doc_version] = Hash.new
  doc_version.mappings.each { |mapping|
    @mappings[doc_version.doc_version][mapping.column_name] = mapping.xml_element
  }
}

对于第一顺序关联的急切加载似乎不适用于测试环境,并且在第一个示例中。即使我使用“包含”它也不起作用。

ActiveRecord或PostgreSQL上的版本之间是否存在导致此问题的区别?

这些是我的模特:

class DocType < EDocsDatabase
  has_many :doc_versions, :dependent => :destroy
  has_many :mappings, :through => :doc_versions
  has_many :service_types
end

class DocVersion < EDocsDatabase
  belongs_to :doc_type
  has_many :mappings, :dependent => :destroy
end

class Mapping < EDocsDatabase
  belongs_to :doc_version
end

1 个答案:

答案 0 :(得分:0)

您使用此代码的上下文是什么?

原因是 - 如果您在响应循环中运行代码(如在服务器中),则当前ActiveRecord需要一些连接池管理。 Rails使用中间件解决了这个问题,该中间件在主应用程序响应程序之外为您管理AR连接。但是,如果您没有这种包装器,则可能会在连接池上“踩”其他应用程序例程,尤其是在使用线程服务器时。