@Raidoのソリューションでdb:migrateの問題が修正されたが、テナントが作成されたとき(db:seedなど)にApartment gemで問題が発生したことを除いて、同じ問題が発生しました。
Railsが自動的enable_extension "postgis"
にschema.rbに追加していることを発見しました。これは、Apartmentがテナントスキーマの作成に使用します。Apartmentが既存のpostgis拡張機能を使用しない理由(おそらくテナント作成時のsearch_pathの問題)は正確にはわかりませんが、これにより同じエラーが発生します。
解決策(それを呼び出すことができる場合)はenable_extension "postgis"
、schema.rbから行を削除することでした。このアプローチの唯一の問題は、schema.rbの更新をトリガーする後続の移行により、行が再追加されることです。
また、postgis拡張機能を独自のスキーマではなくshared_extensionsスキーマに追加するApartmentアプローチを使用しました。私のlib/tasks/db_extensions.rakeは次のようになります。
namespace :db do
desc 'Also create shared_extensions Schema'
task :extensions => :environment do
# Create Schema
ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
# Enable Hstore
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;'
# Enable uuid-ossp for uuid_generate_v1mc()
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;'
# Enable postgis extension for geographic data types
ActiveRecord::Base.connection.execute 'DROP EXTENSION IF EXISTS postgis;'
ActiveRecord::Base.connection.execute 'CREATE EXTENSION postgis WITH SCHEMA shared_extensions;'
ActiveRecord::Base.connection.execute 'GRANT USAGE ON SCHEMA shared_extensions to PUBLIC;'
puts 'Created extensions'
end
end
Rake::Task["db:create"].enhance do
Rake::Task["db:extensions"].invoke
end
Rake::Task["db:test:purge"].enhance do
Rake::Task["db:extensions"].invoke
end
そして私のdatabase.ymlは次のようになります:
postgis_options: &postgis_options
adapter: postgis
postgis_extension: postgis # default is postgis
postgis_schema: shared_extensions # default is public
default: &default
schema_search_path: 'public,shared_extensions'
encoding: utf8
<<: *postgis_options
...
production:
<<: *default
url: <%= ENV['DATABASE_URL'].try(:sub, /^postgres/, 'postgis') %>
理想的ではありませんが、機能しています。おそらくこれはPostGISとApartmentで誰かを1時間か2時間節約するでしょう。enable_extension
schema.rbから呼び出しを削除するよりも良い解決策があるかどうか知りたいです:)