schema.rb中的LOWER索引

时间:2015-08-10 07:38:29

标签: sql ruby-on-rails ruby postgresql

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

create_table "person_identifiers", force: :cascade do |t|
  t.string "identifier", limit: 255
end

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

execute('create index person_identifiers_identifier on person_identifiers using gin (identifier gin_trgm_ops)')

正在按预期工作,因此在模式中我有以下索引:

add_index "person_identifiers", ["identifier"], name: "person_identifiers_identifier", using: :gin

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

execute('create index person_identifiers_identifier on person_identifiers using gin (lower(identifier) gin_trgm_ops)')

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

1 个答案:

答案 0 :(得分:1)

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

要在Rails中使用citext,您需要activerecord-postgresql-citext gem(这需要Rails版本4)。安装gem后,您可以使用

将列迁移到citext

change_column :person_identifiers, :identifier, :citext

请注意,这是一个不区分大小写的 text 列,而不是 string 列。