2

Как я мог бы создать индекс, как этотИндекс по jsonb, что есть массив объектов

CREATE INDEX index_companies_on_addresses_on_zipcode ON companies USING gin ((addresses -> 'zipcode')); 

используя синтаксис миграции?

Я создал, используя синтаксис ниже, и он был создан на базе

execute "CREATE INDEX index_companies_on_addresses_on_zipcode ON companies USING gin ((addresses -> 'zipcode'));" 

, но когда я увидел schema.rb индекс не был там.

Я попытался

add_index :companies, :addresses, using: :gin 

но создать индекс только на адреса столбца (это в jsonb) не на ключевой почтовый индекс.

ответ

2

AFAIK не существует способа сделать add_index понять, что такое индексирование. Не бойся, есть способы обойти это. Вы используете jsonb, поэтому вам не нужно беспокоиться о переносимости базы данных, поэтому вы можете переключиться с db/schema.rb на db/structure.sql для управления вашей схемой. Файл db/structure.sql в значительной степени является родным SQL-дампом структуры базы данных, поэтому он будет содержать все, что понимает база данных (ограничения CHECK, расширенные индексы, ...).

Процесс довольно прост:

  1. config/application.rb Edit, чтобы установить формат схемы:

    class Application < Rails::Application 
        #... 
        config.active_record.schema_format = :sql 
        #... 
    end 
    
  2. Выполнить миграцию, которая использует execute как обычно. Вы захотите использовать отдельный up and down methods в своих миграциях или reversible внутри обычного метода change, потому что ActiveRecord не будет знать, как изменить execute some_raw_sql самостоятельно.

  3. Это должно оставить вас с файлом db/structure.sql, поэтому добавьте его в свой контроль версий и удалите db/schema.rb.

  4. Используйте различные rake задачи для работы с structure.sql вместо schema.rb:

    • db:structure:dump вместо db:schema:dump
    • db:structure:load вместо db:schema:load
Смежные вопросы