У меня есть модель 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 имеют дело с именем индекса, уникальностью и длиной. Я пропускаю способ достигнуть того, что я пытаюсь сделать здесь?