小编Sve*_*ven的帖子

是否可以通过Rails/ActiveRecord迁移添加基于函数的数据库无关索引?

我有一个像这样的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的可用选项处理索引名称,唯一性和长度.我是否忽略了一种方法来完成我在这里要做的事情?

database indexing activerecord ruby-on-rails

10
推荐指数
1
解决办法
1159
查看次数

标签 统计

activerecord ×1

database ×1

indexing ×1

ruby-on-rails ×1