Ich bin auf PostgreSQL 9.3.4
und Rails 4.0.4
.
Ich füge eine "tags" -Spalte und den entsprechenden gin
index hinzu (oder zumindest frage ich nach einem).
Überprüfen Sie die Ergebnisse über psql
:
Beachten Sie, dass der Index "Tags" vom Typ btree
ist - während ich nach gin
gefragt habe.
Erstellen Sie nun manuell einen Index, um anzuzeigen, dass gin
verfügbar ist:
Tatsächlich ist gin
verfügbar.
Zur Zeit verwende ich diese Problemumgehung mit Raw SQL, möchte aber wissen, warum die oben beschriebene Vorgehensweise fehlschlägt:
%Vor%Beachten Sie, dass es einen weiteren Haken gibt!
Es stellt sich heraus, dass db/schema.rb
nicht gin
als Indextyp hat:
Mögliche Zwischenlösung:
%Vor%Warnung!
Bis dieser Fehler behoben ist, müssen Sie Änderungen an db/schema.rb
überprüfen, wenn Sie eine Migration ausführen, da alle zukünftigen Migrationen using: :gin
von der add_index
-Zeile entfernen.
Wie bereits erwähnt, müssen Sie Ihr Schemaformat auf :sql
setzen, indem Sie diese Zeile in Ihrem config/application.rb
:
Wie in dem Rails Migrations-Handbuch erläutert, besteht der Grund darin, dass ein GIN-Index für Postgres spezifisch ist. Wenn Sie datenbankspezifische Elemente verwenden, kann schema.rb
sie nicht erneut erstellen.
Hier ist ein Zitat aus dem Rails-Guide:
Es gibt jedoch einen Kompromiss: db / schema.rb kann keine datenbankspezifischen Elemente wie Trigger oder gespeicherte Prozeduren ausdrücken. Während einer Migration können Sie benutzerdefinierte SQL-Anweisungen ausführen, der Schema-Dumper kann diese Anweisungen nicht aus der Datenbank wiederherstellen. Wenn Sie Funktionen wie diese verwenden, sollten Sie das Schemaformat auf Folgendes setzen: sql.
Sobald Sie das :sql
-Format verwenden, wird Ihr Schema nun in structure.sql
statt in schema.rb
gespeichert. Beide Dateien können nebeneinander existieren, aber nur structure.sql
wird aktualisiert und von der App verwendet, wenn Ihr Format auf :sql
eingestellt ist.
Tags und Links arrays ruby-on-rails postgresql indexing ruby-on-rails-4