Rotaie: convalida l'unicità di due colonne (insieme)


Risposte:


230

È possibile utilizzare una convalida di unicità conscope opzione.

Inoltre, è necessario aggiungere un indice univoco al DB per evitare che i nuovi record passino le convalide quando vengono controllati contemporaneamente prima di essere scritti:

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end

+1 per l'indice, ma -1 per il uniquecome non è riconosciuto. Per quella parte ho usato la risposta qui sotto.
Aleks,

7
Sì, scusa, la chiave di convalida dovrebbe essere uniqueness, no unique. Vedi la documentazione collegata. Risolvere la risposta.
tompave

1
Hm, bello, grazie :) Ripetermi: mettere l'indice porta la soluzione al livello successivo, e non solo come le altre soluzioni di "codifica" in cui mi sono imbattuto, prima di trovare questa risposta. +1 per quello
Aleks l'

70

Mancano tutte le risposte sopra riportate su come convalidare l'unicità di più attributi in un modello. Il codice seguente intende dire come utilizzare più attributi in un ambito.

validates :country, uniqueness: { scope: [:medium, :another_medium] }

Convalida l'unicità di countryin tutte le righe con i valori di mediume another_medium.

Nota: non dimenticare di aggiungere un indice nella colonna sopra, questo assicura un rapido recupero e aggiunge una convalida a livello di DB per record univoci.

Aggiornamento: per aggiungere un indice durante la creazione della tabella

t.index [:medium, :another_medium], unique: true

41

Puoi passare un :scopeparametro al tuo validatore in questo modo:

validates_uniqueness_of :medium, scope: :country

Vedere la documentazione per alcuni altri esempi.


8
@DennisBest "Funziona", ma non protegge dalle condizioni di gara. Se due client effettuano richieste simultanee, entrambi potrebbero passare la convalida se nessuno dei due viene eseguito il commit nel database prima che l'altro venga convalidato. È inoltre necessario un vincolo univoco del database come nella risposta di tompave.
cane pastore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.