40

in Rails 2.x è possibile utilizzare le convalide per assicurarsi di avere un valore unico combinato in questo modo:Rails 3: Convalida valori combinati

validates_uniqueness_of :husband, :scope => :wife 

nella migrazione corrispondente che potrebbe assomigliare a questo:

add_index :family, [:husband, :wife], :unique => true 

Ciò assicurerebbe che la combinazione marito/moglie sia unica nel database. Ora, in Rails 3 la sintassi di validazione è cambiata e l'attributo scope sembra scomparso. Sembra ora:

validates :husband, :presence => true 

Qualche idea su come posso ottenere la convalida combinata in Rails 3? Le convalide di Rails 2.x funzionano ancora in Rails 3, quindi posso ancora usare il primo esempio ma sembra così "vecchio", ci sono modi migliori?

risposta

57

Orso con me. Il modo in cui il metodo di convalida in ActiveModel funziona è cercare un validatore.

:presence => true cerca PresenceValidator e passa le opzioni: true all'inizializzatore del validatore.

Penso che si desidera

validates :husband, :presence => true, :uniqueness => {:scope => :wife} 

(Il validatore unicità è in realtà parte di ActiveRecord, non ActiveModel. E 'davvero interessante come gli sviluppatori impostare questa funzione. E' abbastanza elegante.)

+1

ho solo confermato questo funziona nella mia applicazione. – epochwolf

+0

Sembra fantastico e pulito e tutto tranne ... non funziona nel mio esempio 'un progetto modello' ho provato. Avete fatto qualcosa di speciale? Ho usato 2 stringhe e ho anche provato con 2 numeri interi ma le validazioni sono passate. – Cimm

+0

Sto usando 'validates: contents,: presence => true,: univocità => {: scope =>: comment_thread_id,: message =>" è già stato detto, per favore aggiungi qualcosa di significativo "}' – epochwolf