Можно ли добавить функционально-независимый индекс базы данных через миграцию Rails / ActiveRecord? - PullRequest
10 голосов
/ 03 августа 2010

У меня есть модель ActiveRecord, подобная этой:

create_table "books" do |t|
  t.string "title"
end

class Book < ActiveRecord::Base
  default_scope :order => 'lower(title) DESC'
end

Как вы можете видеть, я хочу отсортировать по строчной форме атрибута title, но это приводит к снижению производительности на уровне базы данных. Это попадание может быть исправлено различными способами в разных базах данных. Например, в PostgreSQL или Oracle вы создаете индекс на основе функций:

CREATE INDEX lowercase_book_title_index ON book (lower(title));

SQLite3 не имеет индексов на основе функций, поэтому вы должны указать параметры сортировки:

CREATE INDEX lowercase_book_title_index ON book (title COLLATE NOCASE);

Я не изучал, как вы делаете это с MySQL, но я уверен, что есть способ (сопоставления? Виртуальные столбцы?).

В любом случае я хотел бы сделать это надлежащим образом в Rails с независимой от базы данных миграцией. Конечно, я могу создать простой индекс, подобный этому:

add_index :books, :title

Но генерируемый индекс чувствителен к регистру. Я понимаю, что могу написать миграцию, зависящую от базы данных, но это не очень элегантно. Это также непрактично - я часто использую SQLite3 на своих рабочих станциях для разработки и PostgreSQL на производстве. Доступные опции для add_index имеют дело с именем индекса, уникальностью и длиной. Я пропускаю способ достигнуть того, что я пытаюсь сделать здесь?

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Краткий ответ: не

Длинный ответ: нет, потому что не все движки баз данных поддерживают то, что поддерживает Rails, или совсем другим способом. Если вы уверены, что все движки баз данных поддерживают это, подайте запрос на добавление возможностей для разработчиков ActiveRecord.

Имейте в виду: в миграциях ActiveRecord вы можете делать только то, что поддерживает все ядро ​​базы данных, специфичные для базы данных компоненты требуют отдельной инициализации и миграции.

Я рекомендую настроить этот порядок сортировки из отдельной задачи rake, которая запускается после db: migrate. В своих более крупных приложениях я использую rake setup, где я могу выполнить эти конкретные шаги.

0 голосов
/ 28 мая 2011

У меня никогда не было проблем с такой сортировкой.По сути, вы хотите, чтобы результаты сортировались следующим образом:

"A bad title"
"A better title"
"a good title"
"An excellent title"

Если это правильно и вы используете mysql, вы можете указать параметры сортировки в вашем database.yml, попробуйте:

production:
  adapter: mysql2 # or mysql for rails < 3
  host: ...
  database: ...
  username: ...
  encoding: utf8 # or whatever you are using
  collation: utf8_general_ci # or whatever fits your language and encoding

utf8_general_ci означает «сопоставлять с utf8 независимо от языка и без учета регистра».

Это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...