schema.rb中的LOWER索引

Mat*_*ski 5 ruby sql postgresql ruby-on-rails

在我的Rails应用程序中,使用PostgreSQL数据库,我有一个如下所示的表:

create_table "person_identifiers", force: :cascade do |t|
  t.string "identifier", limit: 255
end
Run Code Online (Sandbox Code Playgroud)

我想在该列上添加索引.我通过以下迁移执行此操作:

execute('create index person_identifiers_identifier on person_identifiers using gin (identifier gin_trgm_ops)')
Run Code Online (Sandbox Code Playgroud)

这是按预期工作所以在模式中我有以下索引:

add_index "person_identifiers", ["identifier"], name: "person_identifiers_identifier", using: :gin
Run Code Online (Sandbox Code Playgroud)

但我希望这个索引不区分大小写,所以我写道:

execute('create index person_identifiers_identifier on person_identifiers using gin (lower(identifier) gin_trgm_ops)')
Run Code Online (Sandbox Code Playgroud)

但遗憾的是在schema.rb中看不到?我知道我可以使用SQL格式而不是schema.rb,但我想坚持在schema.rb中看到这一点.

小智 1

类似的问题已经被提出并得到回答。但是,PostgreSQL 提供了一种不区分大小写的文本数据类型,称为citext。我在许多字符串大小写不重要的应用程序中使用过这种数据类型,例如用户的电子邮件地址。这允许对该列的查询进行匹配,即使字符串的大小写不同。它还会影响唯一性约束,因此具有相同字符序列但大小写不同的两个字符串现在被视为相同。

要在 Rails 中使用 citext,您将需要activerecord-postgresql-citext gem(这需要 Rails 版本 4)。安装 gem 后,您可以使用以下命令将该列迁移到 citext

change_column :person_identifiers, :identifier, :citext

请记住,这是一个不区分大小写的文本列,而不是字符串列。