Methods
Attributes
[R] aliased_join_table_name
[R] aliased_prefix
[R] aliased_table_name
[R] parent
[R] parent_table_name
[R] reflection
Public Class methods
new(reflection, join_dependency, parent = nil)
      # File vendor/rails/activerecord/lib/active_record/associations.rb, line 1405
1405:             def initialize(reflection, join_dependency, parent = nil)
1406:               reflection.check_validity!
1407:               if reflection.options[:polymorphic]
1408:                 raise EagerLoadPolymorphicError.new(reflection)
1409:               end
1410: 
1411:               super(reflection.klass)
1412:               @parent             = parent
1413:               @reflection         = reflection
1414:               @aliased_prefix     = "t#{ join_dependency.joins.size }"
1415:               @aliased_table_name = table_name # start with the table name
1416:               @parent_table_name  = parent.active_record.table_name
1417: 
1418:               if !parent.table_joins.blank? && parent.table_joins.to_s.downcase =~ %r{join(\s+\w+)?\s+#{aliased_table_name.downcase}\son}
1419:                 join_dependency.table_aliases[aliased_table_name] += 1
1420:               end
1421:               
1422:               unless join_dependency.table_aliases[aliased_table_name].zero?
1423:                 # if the table name has been used, then use an alias
1424:                 @aliased_table_name = active_record.connection.table_alias_for "#{pluralize(reflection.name)}_#{parent_table_name}"
1425:                 table_index = join_dependency.table_aliases[aliased_table_name]
1426:                 @aliased_table_name = @aliased_table_name[0..active_record.connection.table_alias_length-3] + "_#{table_index+1}" if table_index > 0
1427:               end
1428:               join_dependency.table_aliases[aliased_table_name] += 1
1429:               
1430:               if reflection.macro == :has_and_belongs_to_many || (reflection.macro == :has_many && reflection.options[:through])
1431:                 @aliased_join_table_name = reflection.macro == :has_and_belongs_to_many ? reflection.options[:join_table] : reflection.through_reflection.klass.table_name
1432:                 unless join_dependency.table_aliases[aliased_join_table_name].zero?
1433:                   @aliased_join_table_name = active_record.connection.table_alias_for "#{pluralize(reflection.name)}_#{parent_table_name}_join"
1434:                   table_index = join_dependency.table_aliases[aliased_join_table_name]
1435:                   @aliased_join_table_name = @aliased_join_table_name[0..active_record.connection.table_alias_length-3] + "_#{table_index+1}" if table_index > 0
1436:                 end
1437:                 join_dependency.table_aliases[aliased_join_table_name] += 1
1438:               end
1439:             end
Public Instance methods
association_join()
      # File vendor/rails/activerecord/lib/active_record/associations.rb, line 1441
1441:             def association_join
1442:               join = case reflection.macro
1443:                 when :has_and_belongs_to_many
1444:                   " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1445:                      table_alias_for(options[:join_table], aliased_join_table_name),
1446:                      aliased_join_table_name,
1447:                      options[:foreign_key] || reflection.active_record.to_s.classify.foreign_key,
1448:                      reflection.active_record.table_name, reflection.active_record.primary_key] +
1449:                   " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1450:                      table_name_and_alias, aliased_table_name, klass.primary_key,
1451:                      aliased_join_table_name, options[:association_foreign_key] || klass.table_name.classify.foreign_key
1452:                      ]
1453:                 when :has_many, :has_one
1454:                   case
1455:                     when reflection.macro == :has_many && reflection.options[:through]
1456:                       through_conditions = through_reflection.options[:conditions] ? "AND #{interpolate_sql(sanitize_sql(through_reflection.options[:conditions]))}" : ''
1457:                       if through_reflection.options[:as] # has_many :through against a polymorphic join
1458:                         polymorphic_foreign_key  = through_reflection.options[:as].to_s + '_id'
1459:                         polymorphic_foreign_type = through_reflection.options[:as].to_s + '_type'
1460: 
1461:                         " LEFT OUTER JOIN %s ON (%s.%s = %s.%s AND %s.%s = %s) "  % [
1462:                           table_alias_for(through_reflection.klass.table_name, aliased_join_table_name),
1463:                           aliased_join_table_name, polymorphic_foreign_key,
1464:                           parent.aliased_table_name, parent.primary_key,
1465:                           aliased_join_table_name, polymorphic_foreign_type, klass.quote(parent.active_record.base_class.name)] +
1466:                         " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [table_name_and_alias,
1467:                           aliased_table_name, primary_key, aliased_join_table_name, options[:foreign_key] || reflection.klass.to_s.classify.foreign_key
1468:                         ]
1469:                       else
1470:                         if source_reflection.macro == :has_many && source_reflection.options[:as]
1471:                           " LEFT OUTER JOIN %s ON %s.%s = %s.%s "  % [
1472:                             table_alias_for(through_reflection.klass.table_name, aliased_join_table_name), aliased_join_table_name,
1473:                             through_reflection.primary_key_name,
1474:                             parent.aliased_table_name, parent.primary_key] +
1475:                           " LEFT OUTER JOIN %s ON %s.%s = %s.%s AND %s.%s = %s " % [
1476:                             table_name_and_alias,
1477:                             aliased_table_name, "#{source_reflection.options[:as]}_id", 
1478:                             aliased_join_table_name, options[:foreign_key] || primary_key,
1479:                             aliased_table_name, "#{source_reflection.options[:as]}_type", 
1480:                             klass.quote(source_reflection.active_record.base_class.name)
1481:                           ]
1482:                         else
1483:                           case source_reflection.macro
1484:                             when :belongs_to
1485:                               first_key  = primary_key
1486:                               second_key = options[:foreign_key] || klass.to_s.classify.foreign_key
1487:                             when :has_many
1488:                               first_key  = through_reflection.klass.to_s.classify.foreign_key
1489:                               second_key = options[:foreign_key] || primary_key
1490:                           end
1491:                           
1492:                           " LEFT OUTER JOIN %s ON %s.%s = %s.%s "  % [
1493:                             table_alias_for(through_reflection.klass.table_name, aliased_join_table_name), aliased_join_table_name,
1494:                             through_reflection.primary_key_name,
1495:                             parent.aliased_table_name, parent.primary_key] +
1496:                           " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1497:                             table_name_and_alias,
1498:                             aliased_table_name, first_key, 
1499:                             aliased_join_table_name, second_key
1500:                           ]
1501:                         end
1502:                       end
1503:                     
1504:                     when reflection.macro == :has_many && reflection.options[:as]
1505:                       " LEFT OUTER JOIN %s ON %s.%s = %s.%s AND %s.%s = %s" % [
1506:                         table_name_and_alias,
1507:                         aliased_table_name, "#{reflection.options[:as]}_id",
1508:                         parent.aliased_table_name, parent.primary_key,
1509:                         aliased_table_name, "#{reflection.options[:as]}_type",
1510:                         klass.quote(parent.active_record.base_class.name)
1511:                       ]
1512:                     when reflection.macro == :has_one && reflection.options[:as]
1513:                       " LEFT OUTER JOIN %s ON %s.%s = %s.%s AND %s.%s = %s " % [
1514:                         table_name_and_alias,
1515:                         aliased_table_name, "#{reflection.options[:as]}_id",
1516:                         parent.aliased_table_name, parent.primary_key,
1517:                         aliased_table_name, "#{reflection.options[:as]}_type",
1518:                         klass.quote(reflection.active_record.base_class.name)
1519:                       ]
1520:                     else
1521:                       foreign_key = options[:foreign_key] || reflection.active_record.name.foreign_key
1522:                       " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1523:                         table_name_and_alias,
1524:                         aliased_table_name, foreign_key,
1525:                         parent.aliased_table_name, parent.primary_key
1526:                       ]
1527:                   end
1528:                 when :belongs_to
1529:                   " LEFT OUTER JOIN %s ON %s.%s = %s.%s " % [
1530:                      table_name_and_alias, aliased_table_name, reflection.klass.primary_key,
1531:                      parent.aliased_table_name, options[:foreign_key] || klass.to_s.foreign_key
1532:                     ]
1533:                 else
1534:                   ""
1535:               end || ''
1536:               join << %(AND %s.%s = %s ) % [
1537:                 aliased_table_name, 
1538:                 reflection.active_record.connection.quote_column_name(reflection.active_record.inheritance_column), 
1539:                 klass.quote(klass.name)] unless klass.descends_from_active_record?
1540:               join << "AND #{interpolate_sql(sanitize_sql(reflection.options[:conditions]))} " if reflection.options[:conditions]
1541:               join
1542:             end
Protected Instance methods
interpolate_sql(sql)
      # File vendor/rails/activerecord/lib/active_record/associations.rb, line 1557
1557:               def interpolate_sql(sql)
1558:                 instance_eval("%@#{sql.gsub('@', '\@')}@")
1559:               end
pluralize(table_name)
      # File vendor/rails/activerecord/lib/active_record/associations.rb, line 1545
1545:               def pluralize(table_name)
1546:                 ActiveRecord::Base.pluralize_table_names ? table_name.to_s.pluralize : table_name
1547:               end
table_alias_for(table_name, table_alias)
      # File vendor/rails/activerecord/lib/active_record/associations.rb, line 1549
1549:               def table_alias_for(table_name, table_alias)
1550:                 "#{table_name} #{table_alias if table_name != table_alias}".strip
1551:               end
table_name_and_alias()
      # File vendor/rails/activerecord/lib/active_record/associations.rb, line 1553
1553:               def table_name_and_alias
1554:                 table_alias_for table_name, @aliased_table_name
1555:               end