我有一个这样的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));
CREATE INDEX lowercase_book_title_index ON book (title COLLATE NOCASE);
我还没有研究你如何使用MysqL,但我确定有一种方法(排序规则?虚拟列?).
无论如何,我希望以适合的Rails方式通过数据库不可知的迁移来实现.我当然可以创建一个简单的索引:
add_index :books,:title
但是,此生成的索引区分大小写.我意识到我可以编写一个数据库依赖的迁移,但它不是很优雅.这也不实际 – 我经常发现自己在我的开发工作站和Postgresql在生产中使用sqlite3. add_index的可用选项处理索引名称,唯一性和长度.我是否忽略了一种方法来完成我在这里做的工作?