rails上的sqlite3:使用collat​​e nocase创建create_table

使用带有ruby v2.3.0p0的rails 4.2.0

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

所以在我的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使用我创建的索引?

看起来像索引上的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' 

对于搜索的人来说,如果您的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) 
Interesting Posts