Permalink
Browse files

Base.update_all :order and :limit options. Useful for MySQL updates t…

…hat must be ordered to avoid violating unique constraints.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6440 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent f87db85 commit a38f28fff1e9e3faeeb22ac9b7c6b3cdcb7e2b29 @jeremy jeremy committed Mar 17, 2007
Showing with 16 additions and 2 deletions.
  1. +2 −0 activerecord/CHANGELOG
  2. +8 −2 activerecord/lib/active_record/base.rb
  3. +6 −0 activerecord/test/base_test.rb
View
@@ -1,5 +1,7 @@
*SVN*
+* Base.update_all :order and :limit options. Useful for MySQL updates that must be ordered to avoid violating unique constraints. [Jeremy Kemper]
+
* Remove deprecated object transactions. People relying on this functionality should install the object_transactions plugin at http://code.bitsweat.net/svn/object_transactions. Closes #5637 [Koz, Jeremy Kemper]
* PostgreSQL: remove DateTime -> Time downcast. Warning: do not enable translate_results for the C bindings if you have timestamps outside Time's domain. [Jeremy Kemper]
@@ -501,9 +501,15 @@ def destroy(id)
# Updates all records with the SET-part of an SQL update statement in +updates+ and returns an integer with the number of rows updated.
# A subset of the records can be selected by specifying +conditions+. Example:
# Billing.update_all "category = 'authorized', approved = 1", "author = 'David'"
- def update_all(updates, conditions = nil)
+ #
+ # Optional :order and :limit options may be given as the third parameter,
+ # but their behavior is database-specific.
+ def update_all(updates, conditions = nil, options = {})
sql = "UPDATE #{table_name} SET #{sanitize_sql_for_assignment(updates)} "
- add_conditions!(sql, conditions, scope(:find))
+ scope = scope(:find)
+ add_conditions!(sql, conditions, scope)
+ add_order!(sql, options[:order], scope)
+ add_limit!(sql, options, scope)
connection.update(sql, "#{name} Update")
end
@@ -569,6 +569,12 @@ def test_update_all_with_hash
end
end
+ if current_adapter?(:MysqlAdapter)
+ def test_update_all_with_order_and_limit
+ assert_equal 1, Topic.update_all("content = 'bulk updated!'", nil, :limit => 1, :order => 'id DESC')
+ end
+ end
+
def test_update_many
topic_data = { 1 => { "content" => "1 updated" }, 2 => { "content" => "2 updated" } }
updated = Topic.update(topic_data.keys, topic_data.values)

0 comments on commit a38f28f

Please sign in to comment.