ruby-on-rails – 是否可以通过Rails / ActiveRecord迁移添加基于函数的数据库不可知索引?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 是否可以通过Rails / ActiveRecord迁移添加基于函数的数据库不可知索引?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个这样的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

但是,此生成的索引区分大小写.我意识到我可以编写一个数据库依赖的迁移,但它不是很优雅.这也不实际 – 我经常发现自己在我的开发工作站和Postgresql在生产中使用sqlite3. add_index的可用选项处理索引名称,唯一性和长度.我是否忽略了一种方法来完成我在这里做的工作?

解决方法

简答:不

长的答案:不是,因为并不是所有的数据库引擎都支持Rails支持的方式,还是以非常不同的方式.如果您确定所有数据库引擎都支持它,那么将为ActiveRecord开发人员提供一个功能请求.

牢记在心:在ActiveRecord迁移中,您只能做所有数据库引擎支持数据库特定的东西需要从迁移分离的初始化.

我建议从分离的耙子任务设置这个排序规则在db:migrate之后运行.在我更大的应用程序中,我使用耙机设置,我可以在这个具体步骤.

猜你在找的Ruby相关文章