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