sqlite3 on rails: create_table using collate nocase

后端 未结 2 1777
孤城傲影
孤城傲影 2021-01-24 02:13

Using rails 4.2.0 with ruby v2.3.0p0

I want to create indexes that are case insensitive since most of my searches are case insensitive and I don\'t want to have to do a

相关标签:
2条回答
  • 2021-01-24 02:49

    Doesn't look like collation on an index has been merged yet:

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

    This PR, adds collation support for columns by the way.

    The syntax looks like:

    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'
    
    0 讨论(0)
  • 2021-01-24 02:51

    For people searching, if 'collate' is still not available in your version of rails (you'll get "Unknown key: :COLLATE"), then you have to create the index manually:

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

    Then to search using the index, you can do:

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

    The 'find_by_name' won't be case insensitive. I believe you can do this by putting the 'collate nocase' on the create table instead of in the index (this will also need to use an "execute()" call. This means that you will always be forced to match case-insensitive, i.e., this will also be case-insensitive:

    Event.where("name == ?",name)
    
    0 讨论(0)
提交回复
热议问题