Risposte:
La risposta breve per le vecchie versioni di Rails (vedi altre risposte per Rails 4+):
add_index :table_name, :column_name, unique: true
Per indicizzare più colonne insieme, si passa una matrice di nomi di colonna anziché un singolo nome di colonna,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Se ottieni "nome indice ... è troppo lungo", puoi aggiungere name: "whatever"
al metodo add_index per ridurre il nome.
Per un controllo accurato, esiste un execute
metodo " " che esegue SQL diretto.
Questo è tutto!
Se lo stai facendo in sostituzione delle normali convalide del vecchio modello, controlla come funziona. La segnalazione degli errori all'utente non sarà probabilmente piacevole senza convalide a livello di modello. Puoi sempre fare entrambe le cose.
indexed columns are not unique
errore durante il tentativo di creare un indice univoco, è possibile che i dati nella tabella contengano già duplicati. Prova a rimuovere i dati duplicati ed eseguire nuovamente la migrazione.
, :name => "whatever"
al add_index
metodo per abbreviare il nome.
le rotaie generano la migrazione add_index_to_table_name nome_colonna: uniq
o
le rotaie generano migrazione add_column_name_to_table_name nome_colonna: stringa: uniq: indice
genera
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
Se stai aggiungendo un indice a una colonna esistente, rimuovi o commenta la add_column
riga o metti un segno di spunta
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
e non add_column...
.
Dato che questo non è stato ancora menzionato ma risponde alla domanda che ho avuto quando ho trovato questa pagina, puoi anche specificare che un indice dovrebbe essere unico quando lo aggiungi tramite t.references
o t.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(almeno da Rails 4.2.7
)
Sto usando Rails 5 e le risposte sopra funzionano alla grande; ecco un altro modo che ha funzionato anche per me (il nome della tabella è :people
e il nome della colonna è :email_address
)
class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
def change
change_table :people do |t|
t.index :email_address, unique: true
end
end
end
È possibile che si desideri aggiungere il nome per la chiave univoca poiché molte volte il nome della chiave univoca predefinita per rotaie può essere troppo lungo per cui il DB può generare l'errore.
Per aggiungere il nome per il tuo indice basta usare l' name:
opzione. La query di migrazione potrebbe assomigliare a questa:
add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Maggiori informazioni - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
Se hai perso l'aggiunta di univoco alla colonna DB, aggiungi questa convalida nel modello per verificare se il campo è univoco:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
fare riferimento qui sopra è solo a scopo di test, si prega di aggiungere indice modificando la colonna DB come suggerito da @Nate
si prega di fare riferimento a questo con l'indice per ulteriori informazioni