У меня есть модель 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, но я уверен, что существует путь (сопоставления? виртуальные столбцы?).
В любом случае я хотел бы сделать это надлежащим способом направляющих с агностической базой данных миграцией. Я могу, конечно, создать простой индекс как это:
add_index :books, :title
Но индекс, который это генерирует, чувствителен к регистру. Я понимаю, что мог записать зависимую от базы данных миграцию, но это не очень изящно. Это также не практично - я часто использую SQLite3 на своих рабочих станциях разработки и PostgreSQL в производстве. Доступные варианты для add_index имеют дело с именем индекса, уникальностью и длиной. Я пропускаю способ выполнить то, что я пытаюсь сделать здесь?