jsonb上有一个对象数组的索引

时间:2015-10-06 22:01:54

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

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

ajaxUniversal( datos, url, callback ).then( function(data){

     //manipulate data here

});

使用迁移的语法?

我使用下面的语法创建,它是在数据库

上创建的
CREATE INDEX index_companies_on_addresses_on_zipcode ON companies USING gin ((addresses -> 'zipcode'));

但是当我看到schema.rb索引不存在时。

我试过

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

但它只在列地址(是一个jsonb)上创建一个索引,而不是在密钥zipcode上。

1 个答案:

答案 0 :(得分:2)

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