2010-06-08 13 views
82

Ho un modello con le sue validazioni e ho scoperto che non posso aggiornare un attributo senza prima convalidare l'oggetto.Come aggiornare gli attributi senza convalida

Ho già provato ad aggiungere la sintassi on => :create alla fine di ogni riga di convalida, ma ho ottenuto gli stessi risultati.

Il mio modello di annuncio hanno le seguenti convalide:

validates_presence_of :title 
    validates_presence_of :description 
    validates_presence_of :announcement_type_id 

    validate :validates_publication_date 
    validate :validates_start_date 
    validate :validates_start_end_dates 
    validate :validates_category 
    validate :validates_province 

    validates_length_of :title, :in => 6..255, :on => :save 
    validates_length_of :subtitle, :in => 0..255, :on => :save 
    validates_length_of :subtitle, :in => 0..255, :on => :save 
    validates_length_of :place, :in => 0..50, :on => :save 

    validates_numericality_of :vacants, :greater_than_or_equal_to => 0, :only_integer => true 
    validates_numericality_of :price, :greater_than_or_equal_to => 0, :only_integer => true 

Il mio compito rastrello esegue le seguenti operazioni:

task :announcements_expiration => :environment do 
    announcements = Announcement.expired 

    announcements.each do |a| 
     #Gets the user that owns the announcement 
     user = User.find(a.user_id) 
     puts a.title + '...' 

     a.state = 'deactivated' 

     if a.update_attributes(:state => a.state) 
     puts 'state changed to deactivated' 
     else 
     a.errors.each do |e| 
      puts e 
     end 

     end 
    end 

Questo getta tutte le eccezioni di convalida per quel modello, in uscita.

Qualcuno come aggiornare un attributo senza convalidare il modello?

risposta

121

USO update_attribute invece di update_attributes

Aggiorna un singolo attributo e salva il record senza passare attraverso la procedura di convalida normale.

if a.update_attribute('state', a.state) 

Nota: - 'update_attribute' aggiornamento solo attributo alla volta dal codice data in questione penso che lavorerà per voi.

+0

Questo ha funzionato! Grazie. Segnalo come risposta non appena sarò in grado di farlo. –

+8

È possibile utilizzare save (false) senza convalida – Dzmitry

+1

Hmm, ma esiste un modo che analizza ancora i parametri [: instance] come fa update_attributes? – Dogweather

-1

Non dovrebbe essere

validates_length_of :title, :in => 6..255, :on => :create 

quindi funziona solo durante la creazione?

+0

L'OP ha detto: 'Ho già provato ad aggiungere su =>: crea sintassi al fine di ogni riga di validazione, ma ho ottenuto gli stessi risultati. – iwasrobbed

138

Si può fare qualcosa di simile:

object.attribute = value 
object.save(:validate => false) 
+10

attualmente suo oggetto.salva (: validate => false) –

+1

Sì. object.save (: validate => false) funziona per me. Mille grazie per il suggerimento! –

+1

'object.attributes = hash' è un po 'più in linea con la domanda. Se qualcuno si chiede, 'update_attributes (hash)' stesso fa semplicemente 'self.attributes = hash; save'. – Lloeki

18

Yo può usare:

a.update_column :state, a.state 

Check: http://apidock.com/rails/ActiveRecord/Persistence/update_column

aggiorna un singolo attributo di un oggetto, senza chiamare salvare.

+3

Questo è l'approccio migliore se si desidera saltare entrambe le convalide e le callback. C'è anche 'update_columns' se stai cercando di aggiornare più attributi. –

46

provare a utilizzare

@record.assign_attributes({ ... }) 
@record.save(validate: false) 

lavori per me

+1

questa è la risposta valida con Rails 4, una combinazione di tutti i commenti alla risposta attualmente accettata. – toobulkeh

3

Tutta la convalida dal modello sono saltati quando usiamo validate: false

user = User.new(....) 
user.save(validate: false) 
+0

Esattamente quello di cui avevo bisogno. Grazie gentile signore! –

Problemi correlati