使用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会生成的语法,但添加了collate选项:
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使用我创建的索引?
答案 0 :(得分: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'
答案 1 :(得分:0)
对于搜索的人,如果'整理'在您的rails版本中仍然无法使用(您将获得"未知密钥:: 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'不会不区分大小写。我相信你可以通过将整理的nocase'在create table而不是在索引中(这也需要使用" execute()"调用。这意味着你总是被迫匹配不区分大小写,即,这也将是不区分大小写的:
Event.where("name == ?",name)