2016-06-17 2 views
1

Mit Schienen 4.2.0 mit Ruby v2.3.0p0sqlite3 auf Schienen: create_table collate mit nocase

Ich möchte Indizes erstellen, die Fall sind unempfindlich, da die meisten meiner Suche Fall sind unempfindlich und ich will nicht zu müssen jedes Mal eine vollständige Tabelle suchen.

Also in meinem create_table Migrationen, versuche ich Zeilen hinzufügen, wie:

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

Und wenn ich wandern erhalte ich:

== 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 

Wie kann ich einen Groß- und Kleinschreibung Index in meiner Migration erstellen Dateien mit SQLITE3 und Rails?

UPDATE ------------------------

Dank Anthony ‚s Hilfe, ich sehe, dass Schienen nicht collate unterstützt das/Sortierung im Sqlite3-Code noch nicht.

Also versuchte ich es manuell in meiner Migration auf die Syntax basiert schreiben, die Rails generieren würde, aber mit der Sortierfunktion hinzugefügt:

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

Damit wird der Index ordnungsgemäß erstellt, nach Sqlite3, aber das Schema. rb ist jetzt natürlich falsch.

Und was noch wichtiger ist, es scheint immer noch nicht Groß- und Kleinschreibung Vergleiche zu tun, wenn ich suche:

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

Wie überzeugen wir Schienen um den Index zu verwenden ich geschaffen?

+0

Mögliche doppelte: http://stackoverflow.com/questions/7948501/case-insensitive-unique-index-in-rails-activerecord –

Antwort

2

Sieht nicht wie collation auf einen Index noch verschmolzen worden ist:

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

Diese PR, fügt die übrigens für Spalten Sortierungs Unterstützung.

Die Syntax wie folgt aussieht:

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

Gut zu wissen, aber hilft mir jetzt nicht viel, wenn ich die rails nicht installieren will. –

0

Für Menschen auf der Suche, wenn 'collate' in Ihrer Version von Schienen noch nicht verfügbar ist (Sie werden "Unknown Schlüssel: COLLATE" erhalten), dann haben Sie den Index manuell zu erstellen:

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

Dann mit dem Index zu suchen, können Sie tun:

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

Der 'find_by_name' wird nicht zwischen Groß- und Kleinschreibung unterschieden. Ich glaube, Sie können dies tun, indem Sie die 'collate nocase' in die create-Tabelle statt in den Index setzen (dies erfordert auch einen Aufruf von "execute()". Dies bedeutet, dass Sie immer die Groß-/Kleinschreibung beachten müssen , das heißt, dies auch Groß- und Kleinschreibung wird:

Event.where("name == ?",name) 
Verwandte Themen