2012-01-05 14 views
7

Devo eseguire la convalida per verificare che un solo utente all'interno di un'azienda possa esistere all'interno di una determinata categoria.Convalida ActiveRecord: univocità sull'associazione

validates :user_id, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

Questo funziona tranne che il messaggio di errore è impostato sulla chiave :user_id.

Come posso fare lo stesso, ma impostare l'errore sulla chiave :user (validates :user dà un errore)?

+0

'convalida: utente,: unicità => {...} '? – Frost

+0

possibile duplicato - http://stackoverflow.com/questions/8479113/rails-3-1-custom-validation-message-on-join-table-of-has-many-through-relations/8479323#8479323 – maprihoda

+0

@Martin Ho menzionato nella domanda che solleva l'errore. Il duplicato suggerito è una domanda completamente diversa. –

risposta

7

Ecco un modo semplice per controllare l'univocità e forzare l'errore da assegnare all'attributo :user:

class User < ActiveRecord::Base 
    validate :user_unique_per_company_per_category 

    private 

    def user_unique_per_company_per_category 
    if self.class.exists?(:user_id => user_id, :company_id => company_id, :category => category) 
     errors.add :user, 'already exists' 
    end 
    end 
end 

Sarebbe preferibile, penso, se fosse possibile trovare un modo per utilizzare la convalida predefinita su :user_id, ma forse si dispone di un caso d'uso speciale.

Inoltre, se non si sta usando questo in un modulo, si potrebbe considerare di assegnare l'errore :base, dal momento che si potrebbe confondere gli sviluppatori futuri che si aspettano che l'errore a comparire su :user_id:

errors.add :base, 'already exists' 
+0

Sì, la convalida del cliente finora è probabilmente la scelta migliore. Non posso credere che non si possa applicare questa convalida all'utente :(Il problema con la convalida di user_id è che non viene mai utilizzato sull'interfaccia utente, quindi il messaggio di errore come menzionato non sarà nella posizione corretta. –

-1

Non penso che questo sia possibile in quanto il metodo di convalida di ActiveRecord invia gli errori al metodo in fase di convalida.

Quindi convalida: trys utente da inviare a attr_accessor di: utente che non esiste nel modello.

Anche se, se si sta solo cercando di rendere il messaggio di errore piuttosto è possibile:

alias user user_id 

e quindi utilizzare: l'utente nella vostra convalida.

validates :user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 

Su un lato nota, non vorrei usare utente nella alias piuttosto qualcosa di simile:

alias the_supplied_user user_id 

E poi nella vostra convalida:

validates :the_supplied_user, :uniqueness => {:scope => [:category, :company_id], :message => "already exists"} 
+1

Bene, sia l'utente che l'user_id esistono in quanto associazione. Quindi l'aliasing spezzerà tutto. –

Problemi correlati