【问题标题】:Index on jsonb that have an array of objects具有对象数组的 jsonb 上的索引
【发布时间】:2015-10-06 22:01:53
【问题描述】:

我怎样才能创建这样的索引

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)上创建索引,而不是在关键邮政编码上。

【问题讨论】:

    标签: ruby-on-rails postgresql ruby-on-rails-4 rails-activerecord jsonb


    【解决方案1】:

    AFAIK 无法让add_index 理解这种索引。不要害怕,有办法解决这个问题。您正在使用jsonb,因此无需担心数据库可移植性,因此您可以从db/schema.rb 切换到db/structure.sql 来管理您的架构。 db/structure.sql 文件几乎是数据库结构的原生 SQL 转储,因此它将包含数据库可以理解的所有内容(CHECK 约束、高级索引等)。

    过程很简单:

    1. 编辑config/application.rb 以设置架构格式:

      class Application < Rails::Application
        #...
        config.active_record.schema_format = :sql
        #...
      end
      
    2. 正常运行使用execute 的迁移。您需要在迁移中使用单独的 up and down methods 或在通常的 change 方法中使用 reversible,因为 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-29
      • 2020-07-22
      • 1970-01-01
      • 2020-06-10
      • 2017-09-11
      • 2021-12-06
      • 1970-01-01
      • 2012-03-24
      相关资源
      最近更新 更多