# File lib/active_record/associations/through_association_scope.rb, line 116 116: def build_conditions 117: association_conditions = @reflection.options[:conditions] 118: through_conditions = build_through_conditions 119: source_conditions = @reflection.source_reflection.options[:conditions] 120: uses_sti = !@reflection.through_reflection.klass.descends_from_active_record? 121: 122: if association_conditions || through_conditions || source_conditions || uses_sti 123: all = [] 124: 125: [association_conditions, source_conditions].each do |conditions| 126: all << interpolate_sql(sanitize_sql(conditions)) if conditions 127: end 128: 129: all << through_conditions if through_conditions 130: all << build_sti_condition if uses_sti 131: 132: all.map { |sql| "(#{sql})" } * ' AND ' 133: end 134: end
# File lib/active_record/associations/through_association_scope.rb, line 147 147: def build_sti_condition 148: @reflection.through_reflection.klass.send(:type_condition).to_sql 149: end
# File lib/active_record/associations/through_association_scope.rb, line 136 136: def build_through_conditions 137: conditions = @reflection.through_reflection.options[:conditions] 138: if conditions.is_a?(Hash) 139: interpolate_sql(@reflection.through_reflection.klass.send(:sanitize_sql, conditions)).gsub( 140: @reflection.quoted_table_name, 141: @reflection.through_reflection.quoted_table_name) 142: elsif conditions 143: interpolate_sql(sanitize_sql(conditions)) 144: end 145: end
# File lib/active_record/associations/through_association_scope.rb, line 111 111: def conditions 112: @conditions = build_conditions unless defined?(@conditions) 113: @conditions 114: end
Build SQL conditions from attributes, qualified by table name.
# File lib/active_record/associations/through_association_scope.rb, line 21 21: def construct_conditions 22: table_name = @reflection.through_reflection.quoted_table_name 23: conditions = construct_quoted_owner_attributes(@reflection.through_reflection).map do |attr, value| 24: "#{table_name}.#{attr} = #{value}" 25: end 26: conditions << sql_conditions if sql_conditions 27: "(" + conditions.join(') AND (') + ")" 28: end
# File lib/active_record/associations/through_association_scope.rb, line 44 44: def construct_from 45: @reflection.table_name 46: end
Construct attributes for :through pointing to owner and associate.
# File lib/active_record/associations/through_association_scope.rb, line 94 94: def construct_join_attributes(associate) 95: # TODO: revisit this to allow it for deletion, supposing dependent option is supported 96: raise ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection.new(@owner, @reflection) if [:has_one, :has_many].include?(@reflection.source_reflection.macro) 97: 98: join_attributes = construct_owner_attributes(@reflection.through_reflection).merge(@reflection.source_reflection.primary_key_name => associate.id) 99: 100: if @reflection.options[:source_type] 101: join_attributes.merge!(@reflection.source_reflection.options[:foreign_type] => associate.class.base_class.name.to_s) 102: end 103: 104: if @reflection.through_reflection.options[:conditions].is_a?(Hash) 105: join_attributes.merge!(@reflection.through_reflection.options[:conditions]) 106: end 107: 108: join_attributes 109: end
# File lib/active_record/associations/through_association_scope.rb, line 53 53: def construct_joins(custom_joins = nil) 54: polymorphic_join = nil 55: if @reflection.source_reflection.macro == :belongs_to 56: reflection_primary_key = @reflection.klass.primary_key 57: source_primary_key = @reflection.source_reflection.primary_key_name 58: if @reflection.options[:source_type] 59: polymorphic_join = "AND %s.%s = %s" % [ 60: @reflection.through_reflection.quoted_table_name, "#{@reflection.source_reflection.options[:foreign_type]}", 61: @owner.class.quote_value(@reflection.options[:source_type]) 62: ] 63: end 64: else 65: reflection_primary_key = @reflection.source_reflection.primary_key_name 66: source_primary_key = @reflection.through_reflection.klass.primary_key 67: if @reflection.source_reflection.options[:as] 68: polymorphic_join = "AND %s.%s = %s" % [ 69: @reflection.quoted_table_name, "#{@reflection.source_reflection.options[:as]}_type", 70: @owner.class.quote_value(@reflection.through_reflection.klass.name) 71: ] 72: end 73: end 74: 75: "INNER JOIN %s ON %s.%s = %s.%s %s #{@reflection.options[:joins]} #{custom_joins}" % [ 76: @reflection.through_reflection.quoted_table_name, 77: @reflection.quoted_table_name, reflection_primary_key, 78: @reflection.through_reflection.quoted_table_name, source_primary_key, 79: polymorphic_join 80: ] 81: end
Construct attributes for associate pointing to owner.
# File lib/active_record/associations/through_association_scope.rb, line 84 84: def construct_owner_attributes(reflection) 85: if as = reflection.options[:as] 86: { "#{as}_id" => @owner.id, 87: "#{as}_type" => @owner.class.base_class.name.to_s } 88: else 89: { reflection.primary_key_name => @owner.id } 90: end 91: end
Associate attributes pointing to owner, quoted.
# File lib/active_record/associations/through_association_scope.rb, line 31 31: def construct_quoted_owner_attributes(reflection) 32: if as = reflection.options[:as] 33: { "#{as}_id" => owner_quoted_id, 34: "#{as}_type" => reflection.klass.quote_value( 35: @owner.class.base_class.name.to_s, 36: reflection.klass.columns_hash["#{as}_type"]) } 37: elsif reflection.macro == :belongs_to 38: { reflection.klass.primary_key => @owner.class.quote_value(@owner[reflection.primary_key_name]) } 39: else 40: { reflection.primary_key_name => owner_quoted_id } 41: end 42: end
# File lib/active_record/associations/through_association_scope.rb, line 8 8: def construct_scope 9: { :create => construct_owner_attributes(@reflection), 10: :find => { :conditions => construct_conditions, 11: :joins => construct_joins, 12: :include => @reflection.options[:include] || @reflection.source_reflection.options[:include], 13: :select => construct_select, 14: :order => @reflection.options[:order], 15: :limit => @reflection.options[:limit], 16: :readonly => @reflection.options[:readonly], 17: } } 18: end
# File lib/active_record/associations/through_association_scope.rb, line 48 48: def construct_select(custom_select = nil) 49: distinct = "DISTINCT " if @reflection.options[:uniq] 50: selected = custom_select || @reflection.options[:select] || "#{distinct}#{@reflection.quoted_table_name}.*" 51: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.