2010-06-08 12 views
82

Tengo un modelo con sus validaciones, y descubrí que no puedo actualizar un atributo sin validar el objeto antes.Cómo actualizar los atributos sin validación

Ya traté de agregar la sintaxis on => :create al final de cada línea de validación, pero obtuve los mismos resultados.

Mi modelo de anuncio tiene las siguientes validaciones:

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 

Mi tarea rastrillo hace lo siguiente:

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 

Esto arroja todas las excepciones de validación para ese modelo, en la salida.

¿Alguien sabe cómo actualizar un atributo sin validar el modelo?

Respuesta

121

USO update_attribute en lugar de update_attributes

Actualiza un atributo único y guarda el registro sin pasar por el procedimiento de validación normal.

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

Nota: - 'update_attribute' actualización sólo un atributo a la vez desde el código dado en cuestión creo que va a trabajar para usted.

+0

Esto funcionó! Gracias. Marcaré esto como respondido tan pronto como pueda hacerlo. –

+8

Puede usar guardar (falso) sin validación – Dzmitry

+1

Hmm, pero ¿hay alguna forma de analizar los params [: instance] como lo hace update_attributes? – Dogweather

-1

¿No debería ser

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

por lo que sólo funciona durante la creación?

+0

El OP dijo: 'Ya intenté agregar =>: crear sintaxis en el final de cada línea de validación, pero obtuve los mismos resultados. – iwasrobbed

138

Usted puede hacer algo como:

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

en realidad es object.save (: validate => false) –

+1

Sí. object.save (: validate => false) funciona para mí. Muchas gracias por la pista! –

+1

'object.attributes = hash' es un poco más en línea con la pregunta. Si alguien se pregunta, 'update_attributes (hash)' en sí mismo simplemente hace 'self.attributes = hash; guardar'. – Lloeki

18

Puedes usar:

a.update_column :state, a.state 

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

actualiza un solo atributo de un objeto, sin llamar a guardar.

+3

Este es el mejor enfoque si desea omitir las validaciones y las devoluciones de llamada. También hay 'update_columns' si está buscando actualizar múltiples atributos. –

46

trate de usar

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

funciona para mí

+1

esta es la respuesta válida con Rails 4, una combinación de todos los comentarios a la respuesta actualmente aceptada. – toobulkeh

3

Toda la validación del modelo se saltan cuando usamos validate: false

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

Exactamente lo que necesitaba. ¡Gracias buen señor! –

Cuestiones relacionadas