In a rails 2 app I’m building, I have a need to update a collection of records with specific attributes. I have a named scope to find the collection, but I have to iterate over each record to update the attributes. Instead of making one query to update several thousand records, I’ll have to make several thousand queries.
What I’ve found so far is something like Model.find_by_sql("UPDATE products ...)
This feels really junior, but I’ve googled and looked around SO and haven’t found my answer.
For clarity, what I have is:
ps = Product.last_day_of_freshness
ps.each { |p| p.update_attributes(:stale => true) }
What I want is:
Product.last_day_of_freshness.update_attributes(:stale => true)
It sounds like you are looking for ActiveRecord::Base.update_all – from the documentation:
Actually, since this is rails 2.x (You didn’t specify) – the named_scope chaining may not work, you might need to pass the conditions for your named scope as the second parameter to update_all instead of chaining it onto the end of the Product scope.