1

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)

作成したインデックスをレールに使用させるにはどうすればよいですか?

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 に答える