database_validations icon indicating copy to clipboard operation
database_validations copied to clipboard

Incompatible with postgis adapter

Open gap777 opened this issue 2 years ago • 1 comments

Adding gem 'activerecord-postgis-adapter' to your Gemfile and configuring database.yml to use the postgis adapter:

default: &default
  adapter: postgis
  encoding: unicode
  ....

Will yield a system that is incompatible with database_validations, because the adapter name doesn't match, postgres.

Can you extend your supported adapters to also support postgres with the GIS extension?

Thanks!

gap777 avatar May 17 '23 15:05 gap777

Hotpatch initializer to fix this issue:

# frozen_string_literal: true

begin
  DatabaseValidations::Adapters.factory(ActiveRecord::Base)
rescue DatabaseValidations::Errors::UnknownDatabase
  # Add support for the postgis adapter.
  DatabaseValidations::Adapters::PostgresqlAdapter.send(:remove_const, :ADAPTER)
  DatabaseValidations::Adapters::PostgresqlAdapter::ADAPTER = /\A(?:postgresql|postgis)\z/
end

This is based on a similar patch I made (today) to support the trilogy adapter. You don't have to make any other code changes because the adapter is checked with a case when statement.

FYI, here is the original hotpatch initializer for trilogy support:

# frozen_string_literal: true

begin
  DatabaseValidations::Adapters.factory(ActiveRecord::Base)
rescue DatabaseValidations::Errors::UnknownDatabase
  # Add support for the trilogy adapter.
  DatabaseValidations::Adapters::MysqlAdapter.send(:remove_const, :ADAPTER)
  DatabaseValidations::Adapters::MysqlAdapter::ADAPTER = /\A(?:mysql2|trilogy)\z/
end

If you're using an older Ruby version, you might want to freeze the regex. Newer Ruby versions freeze regex literals.

BrianHawley avatar Sep 12 '23 19:09 BrianHawley