/ / convalida rotaie di unicità all'aggiornamento - ruby-on-rails, ruby-on-rails-3

rails validation of unquality on update - ruby-on-rails, ruby-on-rails-3

Ho la seguente regola di validazione su uno dei modelli,

validates :reciept_num, :presence => true,
:numericality => { :only_integer => true },
:uniqueness => true,
:on => :update,
:if => "!status_id.nil?"`

Ora, quando aggiorno l'oggetto usando update_attributes metodo mi dà il seguente errore

reciept_num: has already been taken.

Durante l'aggiornamento dell'oggetto non sto modificando l'attributo reciept_num? Quindi, perché questa convalida fallisce durante l'aggiornamento?

Se non sto aggiornando il valore, deve essere quello vecchio e quindi dovrebbe passare la convalida. Mi manca qualcosa.

risposte:

5 per risposta № 1

Prima di tutto, le convalide non vengono eseguite in base al sel'attributo è cambiato o meno (a meno che ovviamente non lo richiediate esplicitamente). Ogni volta che un record con una convalida di unicità viene salvato e la convalida può essere eseguita (come definito da :on, :if, :unless opzioni) controllerà se ci sono istanze diverse da se stesse con il valore che dovrebbe essere unico.

Dato che hai le condizioni per la tua convalida, immagino che potresti finire per creare due istanze con lo stesso numero di ricevuta, ma dove entrambi hanno un valore nullo status_id. Impostare il status_id La colonna e la validazione entrano in azione e trovano le altre istanze.

Un'altra cosa è che, poiché la tua convalida è in fase di aggiornamento, solo tu potresti creare più istanze con lo stesso numero di ricevuta, tentando nuovamente di aggiornare il record attiverebbe la convalida.

Sto solo indovinando gli scenari precisi però.