Base.update_all :order and :limit options. Useful for MySQL updates that must be ordered to avoid violating unique constraints.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6440 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jeremy Kemper
2007-03-17 15:48:47 +00:00
parent f87db851c6
commit a38f28fff1
3 changed files with 16 additions and 2 deletions

View File

@@ -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]

View File

@@ -501,9 +501,15 @@ module ActiveRecord #:nodoc:
# 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

View File

@@ -569,6 +569,12 @@ class BasicsTest < Test::Unit::TestCase
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)