Heroku:网络测功机中的 PostGIS 列错误,但一次性测功机或工作测功机中没有

Heroku: error for PostGIS column in web dyno but not in one-off or worker dynos

我已经开始开发一个空间应用程序 (PostGIS + Rails + RGeo),在我的一个模型上只有一个 line_string 列。在我的本地机器上一切都很好,问题出在 Heroku web dynos 上,其中 Rails/activerecord 无法识别 RGeo/PostGIS line_string 类型。

每次部署后,第一次加载模型时,我都会在日志中看到以下内容:

app[web.1]: unknown OID 17059: failed to recognize type of 'line_string'. It will be treated as String.

然后,如果我向 STDOUT 添加一些日志记录,我可以看到:

mymodel.line_string.class # String
RGeo::Feature::Geometry.check_type(mymodel.line_string) # false

但是,如果我 运行 带有 rails 控制台的一次性测功机 (heroku run rails c production) 一切都很好。我看到了我期望的输出:

irb(main):001:0> mymodel.line_string.class
=> RGeo::Geographic::SphericalLineStringImpl

irb(main):002:0> RGeo::Feature::Geometry.check_type(mymodel.line_string)
=> true

在worker dynos下也可以。

什么会导致未知的 OID 错误?为什么一次性和 worker dynos 能够完美地使用此专栏,而 web dyno 却不能?

Puma 启动时没有配置我在 application.rb 中添加的 PostGIS。一旦我将以下内容添加到 config/puma.rb:

,ActiveRecord 就开始使用 PostGIS
on_worker_boot do
  if defined?(ActiveRecord::Base)
    config = ActiveRecord::Base.configurations[Rails.env] ||
      Rails.application.config.database_configuration[Rails.env]
    config['adapter'] = 'postgis'
    ActiveRecord::Base.establish_connection(config)
  end
end

on_restart do
  if defined?(ActiveRecord::Base)
    config = ActiveRecord::Base.configurations[Rails.env] ||
      Rails.application.config.database_configuration[Rails.env]
    config['adapter'] = 'postgis'
    ActiveRecord::Base.establish_connection(config)
  end
end

其他 dyno 类型仅使用 application.rb,因此它们始终配置正确。