Die kurze Antwort für alte Versionen von Rails (siehe andere Antworten für Rails 4+):
add_index :table_name, :column_name, unique: true
Um mehrere Spalten zusammen zu indizieren, übergeben Sie ein Array von Spaltennamen anstelle eines einzelnen Spaltennamens.
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Wenn Sie " name: "whatever"
Indexname ... ist zu lang" erhalten, können Sie die Methode add_index hinzufügen , um den Namen zu verkürzen.
Für eine fein abgestimmte Steuerung gibt es eine " execute
" -Methode, die direktes SQL ausführt.
Das ist es!
Wenn Sie dies als Ersatz für reguläre Validierungen alter Modelle tun, überprüfen Sie, wie dies funktioniert. Die Fehlerberichterstattung an den Benutzer ist ohne Validierungen auf Modellebene wahrscheinlich nicht so gut. Sie können immer beides tun.
indexed columns are not unique
beim Versuch, einen eindeutigen Index zu erstellen , eine Fehlermeldung angezeigt wird, liegt dies möglicherweise daran, dass die Daten in der Tabelle bereits Duplikate enthalten. Versuchen Sie, die doppelten Daten zu entfernen und die Migration erneut auszuführen., :name => "whatever"
dieadd_index
Methode ergänzen , um den Namen zu verkürzen.oder
erzeugt
Wenn Sie einer vorhandenen Spalte einen Index hinzufügen, entfernen oder kommentieren Sie die
add_column
Zeile oder setzen Sie ein Häkchenquelle
add_index...
und nichtadd_column...
.Da dies noch nicht erwähnt wurde, aber die Frage beantwortet, die ich hatte, als ich diese Seite gefunden habe, können Sie auch angeben, dass ein Index eindeutig sein soll, wenn Sie ihn über
t.references
oder hinzufügent.belongs_to
:(ab mindestens Rails
4.2.7
)quelle
Wenn Sie eine neue Tabelle erstellen, können Sie die Inline-Verknüpfung verwenden:
quelle
Ich verwende Rails 5 und die obigen Antworten funktionieren hervorragend. Hier ist ein anderer Weg, der auch für mich funktioniert hat (der Tabellenname ist
:people
und der Spaltenname ist:email_address
)quelle
Möglicherweise möchten Sie einen Namen für den eindeutigen Schlüssel hinzufügen, da der Standardname für den eindeutigen Schlüssel per Schiene zu lang sein kann, für den die Datenbank den Fehler auslösen kann.
Um einen Namen für Ihren Index hinzuzufügen, verwenden Sie einfach die
name:
Option. Die Migrationsabfrage könnte ungefähr so aussehen:add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Weitere Informationen - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
quelle
Um mehrere Spalten zusammen zu indizieren, übergeben Sie ein Array von Spaltennamen anstelle eines einzelnen Spaltennamens.
quelle
Wenn Sie die DB-Spalte nicht eindeutig hinzugefügt haben, fügen Sie diese Validierung einfach im Modell hinzu, um zu überprüfen, ob das Feld eindeutig ist:
siehe hier oben dient nur zu Testzwecken. Fügen Sie den Index hinzu, indem Sie die DB-Spalte wie von @Nate vorgeschlagen ändern
Weitere Informationen finden Sie im Index
quelle