aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-10-26 13:20:02 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-10-26 13:20:02 +0000
commit0b92d38c0083c2077d0533014678ed017026fac1 (patch)
tree5127ff1b6bf11f9954932dbcec3c2b3bba6835ca
parent07c494ae24b897bfa1d46f741b9ac14d3b480bc2 (diff)
downloadrails-0b92d38c0083c2077d0533014678ed017026fac1.tar.gz
rails-0b92d38c0083c2077d0533014678ed017026fac1.tar.bz2
rails-0b92d38c0083c2077d0533014678ed017026fac1.zip
Added :offset and :limit to the kinds of options that Base.constrain can use (closes #2466) [duane.johnson@gmail.com]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2748 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/base.rb5
-rwxr-xr-xactiverecord/test/base_test.rb24
3 files changed, 30 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index a19e005f36..8f205a0de3 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Added :offset and :limit to the kinds of options that Base.constrain can use #2466 [duane.johnson@gmail.com]
+
* Fixed handling of nil number columns on Oracle and cleaned up tests for Oracle in general #2555 [schoenm@earthlink.net]
* Added quoted_true and quoted_false methods to db2_adapter and cleaned up tests for DB2 #2493 [maik schmidt]
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index 3ded347178..febb35dd5b 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -809,7 +809,8 @@ module ActiveRecord #:nodoc:
end
# Add constraints to all queries to the same model in the given block.
- # Currently supported constraints are <tt>:conditions</tt> and <tt>:joins</tt>
+ # Currently supported constraints are <tt>:conditions</tt>, <tt>:joins</tt>,
+ # <tt>:offset</tt>, and <tt>:limit</tt>
#
# Article.constrain(:conditions => "blog_id = 1") do
# Article.find(1) # => SELECT * from articles WHERE blog_id = 1 AND id = 1
@@ -883,6 +884,8 @@ module ActiveRecord #:nodoc:
end
def add_limit!(sql, options)
+ options[:limit] ||= scope_constraints[:limit] if scope_constraints[:limit]
+ options[:offset] ||= scope_constraints[:offset] if scope_constraints[:offset]
connection.add_limit_offset!(sql, options)
end
diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb
index ed81645c5e..acfd327556 100755
--- a/activerecord/test/base_test.rb
+++ b/activerecord/test/base_test.rb
@@ -1039,6 +1039,30 @@ class BasicsTest < Test::Unit::TestCase
assert_nothing_raised { Category.new.send(:interpolate_sql, 'foo bar} baz') }
end
+ def test_constrain_conditions
+ developers = Developer.constrain(:conditions => 'salary > 90000') do
+ Developer.find(:all, :conditions => 'id < 5')
+ end
+ david = Developer.find(1)
+ assert !developers.include?(david) # David's salary is less than 90,000
+ assert_equal 3, developers.size
+ end
+
+ def test_constrain_limit_offset
+ developers = Developer.constrain(:limit => 3, :offset => 2) do
+ Developer.find(:all, :order => 'id')
+ end
+ david = Developer.find(1)
+ jamis = Developer.find(1)
+ assert !developers.include?(david) # David has id 1
+ assert !developers.include?(jamis) # Jamis has id 2
+ assert_equal 3, developers.size
+
+ # Now test without constraints to make sure we get the whole thing
+ developers = Developer.find(:all, :order => 'id')
+ assert_equal 10, developers.size
+ end
+
# FIXME: this test ought to run, but it needs to run sandboxed so that it
# doesn't b0rk the current test environment by undefing everything.
#