Пользовательский тип базы данных в ActiveRecord - PullRequest
11 голосов
/ 28 октября 2011

Я использую Rails 3.1.1 с PostgreSQL 9.1 и модуль заземления .Чтобы правильно рассчитать расстояние между различными местоположениями, я настроил столбец с типом earth в моей таблице branches.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мое приложение Rails, которое использует этотаблица не понимает тип земли, и поэтому я получаю это в моем db/schema.rb:

# Could not dump table "branches" because of following StandardError
#   Unknown type 'earth' for column 'location'

Это проблематично, поскольку теперь я не могу создать свою тестовую базу данных из schema.rb.

Как добавить этот тип в AR или сделать так, чтобы он игнорировал этот столбец?

Ответы [ 2 ]

14 голосов
/ 01 августа 2017

Другой случай, когда кто-то может столкнуться с этим, - это вставка ваших пользовательских типов (перечислений) 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.Мне потребовалось много времени, чтобы отследить это до проблемы с дампом схемы.

8 голосов
/ 22 июля 2014

Попробуйте это:

Изменить ваш config / application.rb

config.active_record.schema_format = :sql

Это изменит выходной формат на собственный формат SQL PostgreSQL, schema.rb будет отключен и будет создан новый файл /db/config/structure.sql

...