Другой случай, когда кто-то может столкнуться с этим, - это вставка ваших пользовательских типов (перечислений) postgres в postgresql.Если вы делаете это и по-прежнему хотите использовать Ruby для вашего schema.rb, вы можете добавить пользовательские типы баз данных в список допустимых типов адаптера.
Например, допустим, у вас есть миграция, подобная этой, с address_type
и address_status
.
class CreateAddresses < ActiveRecord::Migration
def up
execute <<-SQL
CREATE TYPE address_status AS ENUM ('active', 'archived');
CREATE TYPE address_type AS ENUM ('billing', 'shipping');
SQL
create_table :customer_addresses do |t|
# bla bla
t.column :address_type, :address_type
t.column :status, :address_status
t.timestamps null: false
end
end
def down
drop_table :customer_addresses
execute <<-SQL
DROP TYPE address_type;
DROP TYPE address_status;
SQL
end
end
Затем создайте инициализатор или добавьте что-то подобное в ваше приложение..rb:
# config/initializers/postres_enum_custom_types.rb
module ActiveRecord
module ConnectionAdapters
if const_defined?(:PostgreSQLAdapter)
class PostgreSQLAdapter
NATIVE_DATABASE_TYPES.merge!(
address_status: { name: 'character varying' },
address_type: { name: 'character varying' }
)
end
end
end
end
Заметки о моем решении:
- Я проверяю наличие
PostgreSQLAdpater
из-за того, что гем статического анализа, который я использую, частично загружаетнекоторые зависимости AR - в частности, гем annotate
. - Источник исходного определения находится здесь .
Справочная информация о том, как я столкнулся с этим: Когда это случилось со мной в rails 5.0.x, миграция прошла нормально, но тогда моя тестовая среда не работала при попытке запустить db:test:prepare
или db:reset
.Мне потребовалось много времени, чтобы отследить это до проблемы с дампом схемы.