Permalink
Browse files

Add support for :order option to with_scope. Closes #3887. [eric.dasp…

…et@survol.net]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4274 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent f274a89 commit 91531372f9b7130f8a940cdb23f19984b65a60fa Marcel Molina committed Apr 26, 2006
Showing with 36 additions and 2 deletions.
  1. +2 −0 activerecord/CHANGELOG
  2. +11 −2 activerecord/lib/active_record/base.rb
  3. +23 −0 activerecord/test/base_test.rb
View
@@ -1,5 +1,7 @@
*SVN*
+* Add support for :order option to with_scope. Closes #3887. [eric.daspet@survol.net]
+
* Prettify output of schema_dumper by making things line up. Closes #4241 [Caio Chassot <caio@v2studio.com>]
* Make build_postgresql_databases task make databases owned by the postgres user. Closes #4790. [mlaster@metavillage.com]
@@ -837,7 +837,7 @@ def with_scope(method_scoping = {}, action = :merge, &block)
method_scoping.assert_valid_keys([ :find, :create ])
if f = method_scoping[:find]
- f.assert_valid_keys([ :conditions, :joins, :select, :include, :from, :offset, :limit, :readonly ])
+ f.assert_valid_keys([ :conditions, :joins, :select, :include, :from, :offset, :limit, :order, :readonly ])
f[:readonly] = true if !f[:joins].blank? && !f.has_key?(:readonly)
end
@@ -1012,8 +1012,8 @@ def construct_finder_sql(options)
add_conditions!(sql, options[:conditions], scope)
sql << " GROUP BY #{options[:group]} " if options[:group]
- sql << " ORDER BY #{options[:order]} " if options[:order]
+ add_order!(sql, options[:order])
add_limit!(sql, options, scope)
sql
@@ -1036,6 +1036,15 @@ def safe_to_array(o)
end
end
+ def add_order!(sql, order)
+ if order
+ sql << " ORDER BY #{order}"
+ sql << ", #{scope(:find, :order)}" if scoped?(:find, :order)
+ else
+ sql << " ORDER BY #{scope(:find, :order)}" if scoped?(:find, :order)
+ end
+ end
+
# The optional scope argument is for the current :find scope.
def add_limit!(sql, options, scope = :auto)
scope = scope(:find) if :auto == scope
@@ -1164,6 +1164,29 @@ def test_scoped_find_limit_offset
assert_equal Developer.count, developers.size
end
+ def test_scoped_find_order
+ # Test order in scope
+ scoped_developers = Developer.with_scope(:find => { :limit => 1, :order => 'salary DESC' }) do
+ Developer.find(:all)
+ end
+ assert_equal 'Jamis', scoped_developers.first.name
+ assert scoped_developers.include?(developers(:jamis))
+ # Test scope without order and order in find
+ scoped_developers = Developer.with_scope(:find => { :limit => 1 }) do
+ Developer.find(:all, :order => 'salary DESC')
+ end
+ # Test scope order + find order, find has priority
+ scoped_developers = Developer.with_scope(:find => { :limit => 3, :order => 'id DESC' }) do
+ Developer.find(:all, :order => 'salary ASC')
+ end
+ assert scoped_developers.include?(developers(:poor_jamis))
+ assert scoped_developers.include?(developers(:david))
+ assert scoped_developers.include?(developers(:dev_10))
+ # Test without scoped find conditions to ensure we get the right thing
+ developers = Developer.find(:all, :order => 'id', :limit => 1)
+ assert scoped_developers.include?(developers(:david))
+ end
+
def test_base_class
assert LoosePerson.abstract_class?
assert !LooseDescendant.abstract_class?

0 comments on commit 9153137

Please sign in to comment.