14

Ho un modello che ha due campi, che chiamerò first_name e last_name, e voglio assicurarmi che la combinazione dei due sia case-insensitively unique. Ho ottenuto a metà strada utilizzando questo:Rails validates_uniqueness_of across multiple columns with case insensitivity

validates_uniqueness_of :first_name, :scope => :last_name 

Il problema è che il controllo di unicità sembra essere maiuscole e minuscole, anche se the documentation dice che dovrebbe essere case insensitive per impostazione predefinita. Quindi, dato un record esistente:

{ :first_name => 'John', :last_name => 'Smith' } 

Questo sarà consentito:

{ :first_name => 'JOHN', :last_name => 'SMITH' } 

nonché ogni ulteriore record in cui v'è una variazione di caso sia nel nome o il cognome. Perché questi record sono consentiti? Come posso applicare l'unicità insensibile alle maiuscole e minuscole in entrambi i campi insieme?

risposta

21

Hai provato validates_uniqueness_of :first_name, :scope => :last_name, :case_sensitive => false?

Il documentation says è vero per impostazione predefinita.

(credo che il link che hai dato è in una certa documentazione ormai obsoleti. IIRC, il valore predefinito per questo cambiamento ha fatto negli ultimi due anni.)

+0

Hai ragione! Sono stato fuorviato dalla documentazione che ho trovato. L'impostazione ': case_sensitive => false' ha funzionato per il first_name, ma non ha funzionato nell'altra direzione. Accetterà comunque '{: first_name => 'John',: last_name => 'SMITH'}'. C'è un modo per farlo funzionare in modo bidirezionale? Dovrei semplicemente includere due regole 'validates_uniqueness_of' con il campo scambiato? –

+0

Ho provato ad aggiungere un'altra convalida con i due campi scambiati. Ora catturerà i casi in cui uno dei campi è differente, ma non se lo sono entrambi, quindi questo continua a passare: '{: first_name => 'JOHN',: last_name => 'SMITH'}'. –

+1

Scriverei un metodo di convalida personalizzato a questo punto se fossi in te. –