toptal / database_validations

Database validations for ActiveRecord
MIT License
530 stars 13 forks source link

Incompatible with postgis adapter #65

Open gap777 opened 1 year ago

gap777 commented 1 year ago

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!

BrianHawley commented 12 months ago

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.