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 1446 1446 tables_from_conditions = conditions_tables(options) 1447 1447 tables_from_order = order_tables(options) 1448 1448 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 1449 1455 1450 1456 is_distinct = !options[:joins].blank? || include_eager_conditions?(options, tables_from_conditions) || include_eager_order?(options, tables_from_order) 1451 1457 sql = "SELECT " … … 1457 1463 sql << " FROM #{connection.quote_table_name table_name} " 1458 1464 1459 1465 if is_distinct 1460 sql << join_dependency.join_associations.reject{ |ja| !all_tables.include?(ja.table_name) }.collect(&:association_join).join1466 sql << distinct_join_associations.collect(&:association_join).join 1461 1467 add_joins!(sql, options, scope) 1462 1468 end 1463 1469 … … 1617 1623 end 1618 1624 end 1619 1625 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 1620 1643 protected 1621 1644 def build(associations, parent = nil) 1622 1645 parent ||= @joins.last -
a/activerecord/test/cases/finder_test.rb
old new 8 8 require 'models/developer' 9 9 require 'models/post' 10 10 require 'models/customer' 11 require 'models/job' 11 12 12 13 class FinderTest < ActiveRecord::TestCase 13 14 fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :customers … … 857 858 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?}} 858 859 end 859 860 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 860 869 protected 861 870 def bind(statement, *vars) 862 871 if vars.first.is_a?(Hash)