我有一个像这样的ActiveRecord模型:
create_table "books" do |t|
t.string "title"
end
class Book < ActiveRecord::Base
default_scope :order => 'lower(title) DESC'
end
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我希望按title属性的小写形式进行排序,但这会在数据库级别上造成性能损失.可以使用不同的数据库以不同的方式纠正此命中.例如,在PostgreSQL或Oracle中,您可以创建基于函数的索引:
CREATE INDEX lowercase_book_title_index ON book (lower(title));
Run Code Online (Sandbox Code Playgroud)
SQLite3没有基于函数的索引,因此您必须指定排序规则:
CREATE INDEX lowercase_book_title_index ON book (title COLLATE NOCASE);
Run Code Online (Sandbox Code Playgroud)
我没有研究过你是如何用MySQL做的,但我确定有一种方法(整理?虚拟列?).
无论如何,我希望以正确的Rails方式进行数据库无关的迁移.我当然可以创建一个这样的简单索引:
add_index :books, :title
Run Code Online (Sandbox Code Playgroud)
但是这个生成的索引区分大小写.我意识到我可以编写一个依赖于数据库的迁移,但它不是很优雅.它也不实用 - 我经常发现自己在我的开发工作站上使用SQLite3,在生产中使用PostgreSQL.add_index的可用选项处理索引名称,唯一性和长度.我是否忽略了一种方法来完成我在这里要做的事情?