1

将 rails 4.2.0 与 ruby​​ v2.3.0p0 一起使用

我想创建不区分大小写的索引,因为我的大多数搜索都不区分大小写,而且我不想每次都进行全表搜索。

因此,在我的 create_table 迁移中,我尝试添加以下行:

add_index :events, :name, :COLLATE => :NOCASE

当我迁移时,我得到:

== 20150515163641 CreateEvents: migrating =====================================
-- create_table(:events)
   -> 0.0018s
-- add_index(:events, :submitter, {:COLLATE=>:NOCASE})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

Unknown key: :COLLATE. Valid keys are: :unique, :order, :name, :where, :length, :internal, :using, :algorithm, :type

如何使用 SQLITE3 和 rails 在我的迁移文件中创建不区分大小写的索引?

更新 - - - - - - - - - - - -

感谢Anthony的帮助,我看到 rails 尚不支持 Sqlite3 代码中的整理/整理。

因此,我尝试根据 Rails 生成的语法在迁移中手动编写它,但添加了 collat​​e 选项:

execute("CREATE INDEX 'index_events_on_name' ON 'events' ('name' COLLATE NOCASE);")

根据 Sqlite3,这会正确创建索引,但是 Schema.rb 现在当然是错误的。

更重要的是,当我搜索时,它似乎仍然没有进行不区分大小写的比较:

Event.where("name == ?",name)
Event.find_by_name(name)

如何说服 rails 使用我创建的索引?

4

2 回答 2

2

看起来collation还没有合并索引:

https://github.com/rails/rails/pull/18499/files

这个PR顺便添加了对列的排序规则支持。

语法如下:

create_table :foo do |t|
  t.string :string_nocase, collation: 'NOCASE'
  t.text :text_rtrim, collation: 'RTRIM'
end

add_column :foo, :title, :string, collation: 'RTRIM'

change_column :foo, :title, :string, collation: 'NOCASE'
于 2016-06-17T11:11:51.640 回答
0

对于搜索的人,如果您的 rails 版本中仍然没有“collat​​e”(您将获得“Unknown key: :COLLATE”),那么您必须手动创建索引:

execute("CREATE INDEX 'index_events_on_name' ON 'events' ('name' COLLATE NOCASE);")

然后使用索引进行搜索,您可以执行以下操作:

Event.where("name collate nocase == ?",name)
Event.where("name LIKE ?",name)

'find_by_name' 不会区分大小写。我相信您可以通过将“collat​​e nocase”放在创建表而不是索引中来做到这一点(这也需要使用“execute()”调用。这意味着您将始终被迫匹配不区分大小写,即这也将不区分大小写:

Event.where("name == ?",name)
于 2016-07-06T08:04:33.410 回答