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

Ticket #9560: 0001-Added-logic-to-associations.rb-to-make-sure-select_f.patch

File 0001-Added-logic-to-associations.rb-to-make-sure-select_f.patch, 4.0 kB (added by jdevine, 1 week ago)
  • a/activerecord/lib/active_record/associations.rb

    old new  
    14461446          tables_from_conditions = conditions_tables(options) 
    14471447          tables_from_order      = order_tables(options) 
    14481448          all_tables             = tables_from_conditions + tables_from_order 
     1449          distinct_join_associations = all_tables.uniq.map{|table|  
     1450            join_dependency.joins_for_table_name(table) 
     1451          }.flatten.compact.uniq 
     1452 
     1453 
     1454 
    14491455 
    14501456          is_distinct = !options[:joins].blank? || include_eager_conditions?(options, tables_from_conditions) || include_eager_order?(options, tables_from_order) 
    14511457          sql = "SELECT " 
     
    14571463          sql << " FROM #{connection.quote_table_name table_name} " 
    14581464 
    14591465          if is_distinct 
    1460             sql << join_dependency.join_associations.reject{ |ja| !all_tables.include?(ja.table_name) }.collect(&:association_join).join 
     1466            sql << distinct_join_associations.collect(&:association_join).join            
    14611467            add_joins!(sql, options, scope) 
    14621468          end 
    14631469 
     
    16171623            end 
    16181624          end 
    16191625 
     1626          def join_for_table_name(table_name) 
     1627            @joins.select{|j|j.aliased_table_name == table_name.gsub(/^\"(.*)\"$/){$1} }.first rescue nil 
     1628          end 
     1629 
     1630          def joins_for_table_name(table_name) 
     1631            join = join_for_table_name(table_name)             
     1632            result = nil             
     1633            if join && join.is_a?(JoinAssociation) 
     1634              result = [join] 
     1635              if join.parent && join.parent.is_a?(JoinAssociation) 
     1636                result = joins_for_table_name(join.parent.aliased_table_name) +              
     1637                         result 
     1638              end 
     1639            end 
     1640            result 
     1641          end 
     1642 
    16201643          protected 
    16211644            def build(associations, parent = nil) 
    16221645              parent ||= @joins.last 
  • a/activerecord/test/cases/finder_test.rb

    old new  
    88require 'models/developer' 
    99require 'models/post' 
    1010require 'models/customer' 
     11require 'models/job' 
    1112 
    1213class FinderTest < ActiveRecord::TestCase 
    1314  fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :customers 
     
    857858      Company.connection.select_rows("SELECT id, name FROM companies WHERE id IN (1,2,3) ORDER BY id").map! {|i| i.map! {|j| j.to_s unless j.nil?}} 
    858859  end 
    859860 
     861  def test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct 
     862    assert_equal 2, Post.find(:all,:include=>{:authors=>:author_address},:order=>' author_addresses.id DESC ', :limit=>2).size 
     863 
     864    assert_equal 3, Post.find(:all,:include=>{:author=>:author_address,:authors=>:author_address}, 
     865                              :order=>' author_addresses_authors.id DESC ', :limit=>3).size 
     866  end 
     867 
     868 
    860869  protected 
    861870    def bind(statement, *vars) 
    862871      if vars.first.is_a?(Hash)