How to update attributes without validation

Brian Roisentul picture Brian Roisentul · Jun 8, 2010 · Viewed 128.7k times · Source

I've got a model with its validations, and I found out that I can't update an attribute without validating the object before.

I already tried to add on => :create syntax at the end of each validation line, but I got the same results.

My announcement model have the following validations:

  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

My rake task does the following:

  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

This throws all the validation exceptions for that model, in the output.

Does anybody how to update an attribute without validating the model?

Answer

Olivier Grimard picture Olivier Grimard · Feb 28, 2012

You can do something like:

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