Skip to main content

How to Skip Validations When Updating in Rails

Rails provides several methods to update records, but one that stands out for its simplicity and efficiency is update_attribute.

What does update_attribute do?

  • Direct Attribute Update: Unlike update, update_attribute targets a single attribute. This means you don’t need to pass a hash of attributes; just the attribute name and its new value.
  • Bypass Validation: The most significant feature of update_attribute is that it skips validation. This is useful in scenarios where you’re certain the new value is valid, and you don’t want to incur the overhead of running validations.
  • Callback Invocation: While it bypasses validations, update_attribute still invokes callbacks. This means before_save, after_save, and other relevant callbacks will be executed.
  • Updated_at Timestamp: If your model has an updated_at timestamp, it will be updated to reflect the change.

The Problem

Imagine you have a Rails model with a validation that ensures a value must always be greater than zero:

1
2
3
class Product < ApplicationRecord
  validates :stock, numericality: { greater_than: 0 }
end

This validation is critical for the system’s functionality but there’s a specific case where you need to set stock to 0 for a certain product. Directly attempting to update the value will trigger the validation error:

1
2
product = Product.find(1)
product.update(stock: 0) # This will fail due to the validation

To bypass validations, you can use the update_attribute method. Here’s how:

1
2
product = Product.find(1)
product.update_attribute(:stock, 0)

Cautions

  • Bypass Validation: Remember, bypassing validation means you’re responsible for ensuring the data integrity. Use this method judiciously.
  • Performance Implications: While update_attribute can be faster, excessive use can lead to performance issues, especially in large-scale applications.
  • Limited Scope: It’s designed for updating a single attribute.

In conclusion, update_attribute is a powerful tool in your Rails toolkit, offering a quick and efficient way to update a single attribute. However, its bypass of validations means it should be used with care. Understanding its strengths and limitations will help you make informed decisions about when to use it.