method

update_all

rails latest stable - Class: ActiveRecord::Relation
update_all(updates)
public

Updates all records in the current relation with details given. This method constructs a single SQL UPDATE statement and sends it straight to the database. It does not instantiate the involved models and it does not trigger Active Record callbacks or validations. However, values passed to #update_all will still go through Active Record’s normal type casting and serialization. Returns the number of rows affected.

Note: As Active Record callbacks are not triggered, this method will not automatically update updated_at/updated_on columns.

Parameters

  • updates - A string, array, or hash representing the SET part of an SQL statement. Any strings provided will be type cast, unless you use Arel.sql. (Don’t pass user-provided values to Arel.sql.)

Examples

# Update all customers with the given attributes
Customer.update_all wants_email: true

# Update all books with 'Rails' in their title
Book.where('title LIKE ?', '%Rails%').update_all(author: 'David')

# Update all books that match conditions, but limit it to 5 ordered by date
Book.where('title LIKE ?', '%Rails%').order(:created_at).limit(5).update_all(author: 'David')

# Update all invoices and set the number column to its id value.
Invoice.update_all('number = id')

# Update all books with 'Rails' in their title
Book.where('title LIKE ?', '%Rails%').update_all(title: Arel.sql("title + ' - volume 1'"))

5Notes

Timestamps

openface · Mar 23, 20115 thanks

Note that ActiveRecord will not update the timestamp fields (updated_at/updated_on) when using update_all().

complex conditions

boblin · Dec 10, 20103 thanks

If you need add complex conditions you can use this:

Model.where(:foo => 'bar').where(:attr => 1).update_all("author = 'David'")

bug?

codesnik · Jun 14, 20111 thank

beware, update_all silently ignores :limit and :order option in 3.0.8.

I've fixed my code temporarily with

update_all "foo=1 where #{myscope.where_values} limit 1"

bug's fixed, though

codesnik · Jun 17, 20111 thank

in 3.1.0. it works in sqlite3 even, via nested query

but 3.0.3, 3.0.7-9 all broken

Update multiple attributes with raw sql

jamesconant · Oct 1, 20131 thank

You can update multiple attributes with sql for each record being updated by using the following syntax:

==== example

Model.update_all("foo = 'bar', baz = 'bat'")