Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 4274

Show
Ignore:
Timestamp:
04/26/06 06:37:04 (2 years ago)
Author:
marcel
Message:

Add support for :order option to with_scope. Closes #3887. [eric.daspet@survol.net]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activerecord/CHANGELOG

    r4273 r4274  
    11*SVN* 
     2 
     3* Add support for :order option to with_scope. Closes #3887. [eric.daspet@survol.net] 
    24 
    35* Prettify output of schema_dumper by making things line up. Closes #4241 [Caio  Chassot <caio@v2studio.com>] 
  • trunk/activerecord/lib/active_record/base.rb

    r4225 r4274  
    838838 
    839839        if f = method_scoping[:find] 
    840           f.assert_valid_keys([ :conditions, :joins, :select, :include, :from, :offset, :limit, :readonly ]) 
     840          f.assert_valid_keys([ :conditions, :joins, :select, :include, :from, :offset, :limit, :order, :readonly ]) 
    841841          f[:readonly] = true if !f[:joins].blank? && !f.has_key?(:readonly) 
    842842        end 
     
    10131013 
    10141014          sql << " GROUP BY #{options[:group]} " if options[:group] 
    1015           sql << " ORDER BY #{options[:order]} " if options[:order] 
    1016  
     1015 
     1016          add_order!(sql, options[:order]) 
    10171017          add_limit!(sql, options, scope) 
    10181018 
     
    10341034          else 
    10351035            [o] 
     1036          end 
     1037        end 
     1038 
     1039        def add_order!(sql, order) 
     1040          if order 
     1041            sql << " ORDER BY #{order}" 
     1042            sql << ", #{scope(:find, :order)}" if scoped?(:find, :order) 
     1043          else 
     1044            sql << " ORDER BY #{scope(:find, :order)}" if scoped?(:find, :order) 
    10361045          end 
    10371046        end 
  • trunk/activerecord/test/base_test.rb

    r4188 r4274  
    11651165  end 
    11661166 
     1167  def test_scoped_find_order    
     1168    # Test order in scope    
     1169    scoped_developers = Developer.with_scope(:find => { :limit => 1, :order => 'salary DESC' }) do 
     1170      Developer.find(:all) 
     1171    end    
     1172    assert_equal 'Jamis', scoped_developers.first.name 
     1173    assert scoped_developers.include?(developers(:jamis)) 
     1174    # Test scope without order and order in find 
     1175    scoped_developers = Developer.with_scope(:find => { :limit => 1 }) do 
     1176      Developer.find(:all, :order => 'salary DESC') 
     1177    end    
     1178    # Test scope order + find order, find has priority 
     1179    scoped_developers = Developer.with_scope(:find => { :limit => 3, :order => 'id DESC' }) do 
     1180      Developer.find(:all, :order => 'salary ASC') 
     1181    end 
     1182    assert scoped_developers.include?(developers(:poor_jamis)) 
     1183    assert scoped_developers.include?(developers(:david)) 
     1184    assert scoped_developers.include?(developers(:dev_10)) 
     1185    # Test without scoped find conditions to ensure we get the right thing 
     1186    developers = Developer.find(:all, :order => 'id', :limit => 1) 
     1187    assert scoped_developers.include?(developers(:david)) 
     1188  end 
     1189 
    11671190  def test_base_class 
    11681191    assert LoosePerson.abstract_class?