aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/base.rb20
-rwxr-xr-xactiverecord/test/base_test.rb18
3 files changed, 30 insertions, 10 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 21ffbe08ae..bfbd85b548 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Added by parameter to increment, decrement, and their bang varieties so you can do player1.increment!(:points, 5) #10542 [Sam]
+
* Optimize ActiveRecord::Base#exists? to use #select_all instead of #find. Closes #10605 [jamesh, fcheung, protocool]
* Don't unnecessarily load has_many associations in after_update callbacks. Closes #6822 [stopdropandrew, canadaduane]
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index 2cdb43566c..149ee61c52 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -2052,28 +2052,28 @@ module ActiveRecord #:nodoc:
save!
end
- # Initializes the +attribute+ to zero if nil and adds one. Only makes sense for number-based attributes. Returns self.
- def increment(attribute)
+ # Initializes the +attribute+ to zero if nil and adds the value passed as +by+ (default is one). Only makes sense for number-based attributes. Returns self.
+ def increment(attribute, by = 1)
self[attribute] ||= 0
- self[attribute] += 1
+ self[attribute] += by
self
end
# Increments the +attribute+ and saves the record.
- def increment!(attribute)
- increment(attribute).update_attribute(attribute, self[attribute])
+ def increment!(attribute, by = 1)
+ increment(attribute, by).update_attribute(attribute, self[attribute])
end
- # Initializes the +attribute+ to zero if nil and subtracts one. Only makes sense for number-based attributes. Returns self.
- def decrement(attribute)
+ # Initializes the +attribute+ to zero if nil and subtracts the value passed as +by+ (default is one). Only makes sense for number-based attributes. Returns self.
+ def decrement(attribute, by = 1)
self[attribute] ||= 0
- self[attribute] -= 1
+ self[attribute] -= by
self
end
# Decrements the +attribute+ and saves the record.
- def decrement!(attribute)
- decrement(attribute).update_attribute(attribute, self[attribute])
+ def decrement!(attribute, by = 1)
+ decrement(attribute, by).update_attribute(attribute, self[attribute])
end
# Turns an +attribute+ that's currently true into false and vice versa. Returns self.
diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb
index 8b3a279287..7ea21156f1 100755
--- a/activerecord/test/base_test.rb
+++ b/activerecord/test/base_test.rb
@@ -1275,6 +1275,15 @@ class BasicsTest < Test::Unit::TestCase
assert_equal 1, topics(:first).parent_id
end
+ def test_increment_attribute_by
+ assert_equal 50, accounts(:signals37).credit_limit
+ accounts(:signals37).increment! :credit_limit, 5
+ assert_equal 55, accounts(:signals37, :reload).credit_limit
+
+ accounts(:signals37).increment(:credit_limit, 1).increment!(:credit_limit, 3)
+ assert_equal 59, accounts(:signals37, :reload).credit_limit
+ end
+
def test_decrement_attribute
assert_equal 50, accounts(:signals37).credit_limit
@@ -1285,6 +1294,15 @@ class BasicsTest < Test::Unit::TestCase
assert_equal 47, accounts(:signals37, :reload).credit_limit
end
+ def test_decrement_attribute_by
+ assert_equal 50, accounts(:signals37).credit_limit
+ accounts(:signals37).decrement! :credit_limit, 5
+ assert_equal 45, accounts(:signals37, :reload).credit_limit
+
+ accounts(:signals37).decrement(:credit_limit, 1).decrement!(:credit_limit, 3)
+ assert_equal 41, accounts(:signals37, :reload).credit_limit
+ end
+
def test_toggle_attribute
assert !topics(:first).approved?
topics(:first).toggle!(:approved)