Функциональные индексы Rails Postgres - PullRequest
6 голосов
/ 16 июля 2010

Как мне ввести мои многоцветные индексы, которые содержат функции, в schema.rb?

например, это НЕ работает:

add_index "temporary_events", ["templateinfoid", "campaign", "date(gw_out_time)", "messagetype"], :name => "temporary_events_campaign_tinfoid_date_messagetype"

rake db: тест: нагрузка

грабли прерваны!

PGError: ОШИБКА: столбец "date (gw_out_time)" не существует

: СОЗДАТЬ ИНДЕКС "временный_венец_campaign_tinfoid_date_messagetype" ON "временный_венец" ("templateinfoid", "кампания", "дата (gw_out_time", "тип сообщения")

Ответы [ 3 ]

15 голосов
/ 17 июля 2010

Встроенный метод ActiveRecord для создания индексов (add_index) не поддерживает функции или любые другие более продвинутые функции. Вместо этого вы можете использовать execute для создания индекса с помощью SQL:

execute <<-SQL
  CREATE INDEX temporary_events_campaign_tinfoid_date_messagetype
  ON temporary_events(templateinfoid, campaign, date(gw_out_time), messagetype);
SQL

Обратите внимание, что использование execute в миграциях может быть проблематичным, если вы не используете формат схемы SQL (config.active_record.schema_format = :sql). Для получения дополнительной информации выполните поиск schema_format .

.
5 голосов
/ 12 декабря 2011

Мне удалось получить функциональные индексы из миграций Rails (3.1.3), удалив пару ограждений!

  # lib/functional_indexes.rb
  module ActiveRecord
    module ConnectionAdapters
      module SchemaStatements
        #disable quoting of index columns to allow functional indexes (e.g  lower(full_name) )
        def quoted_columns_for_index(column_names, options = {})
          column_names
        end

        def index_name_for_remove(table_name, options = {})
          index_name = index_name(table_name, options)

          # disable this error check -- it can't see functional indexes
          #unless index_name_exists?(table_name, index_name, true)
          #  raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
          #end

          index_name
        end
      end
    end
  end

Я должен был сделать свои собственные имена индексов, хотя:

  class AddLowerCaseIndexes < ActiveRecord::Migration
    def up
      add_index :people, 'lower(full_name)', :name => "index_people_on_lower_full_name"
      add_index :people, 'lower(company)',   :name => "index_people_on_lower_company"
    end

    def down
      remove_index :people, :name => "index_people_on_lower_full_name"
      remove_index :people, :name => "index_people_on_lower_company"
    end
  end

(Возможно, вам не нужны кавычки вокруг имен столбцов индекса, если вы не делаете что-то безумное, например, ставите в них пробелы или странные символы.)

(Вы, вероятно, в порядке с сообщениями об ошибках postgres при попытке отката несуществующих индексов.)

1 голос
/ 21 января 2014

Если вы используете камень pg_power (https://github.com/TMXCredit/pg_power), Вы можете сделать это следующим образом:

add_index(:comments, 'dmetaphone(author)', :using => 'gist')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...