class ActiveForce::Association::EagerLoadBuilderForNestedIncludes
Attributes
association_mapping[R]
current_sobject[R]
fields[R]
parent_association_field[R]
query_fields[R]
relations[R]
Public Class Methods
build(relations, current_sobject, parent_association_field = nil, query_fields = nil)
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 9 def build(relations, current_sobject, parent_association_field = nil, query_fields = nil) new(relations, current_sobject, parent_association_field, query_fields).projections end
new(relations, current_sobject, parent_association_field = nil, query_fields = nil)
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 16 def initialize(relations, current_sobject, parent_association_field = nil, query_fields = nil) @relations = [relations].flatten @current_sobject = current_sobject @association_mapping = {} @parent_association_field = parent_association_field @query_fields = query_fields @fields = [] end
Public Instance Methods
build_hash_includes(relation, model = current_sobject, parent_association_field = nil)
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 52 def build_hash_includes(relation, model = current_sobject, parent_association_field = nil) relation.each do |key, value| association = model.associations[key] raise InvalidAssociationError, "Association named #{key} was not found on #{model}" if association.nil? case association when ActiveForce::Association::BelongsToAssociation build_includes(association) nested_query = build_relation_for_belongs_to(association, value) fields.concat(nested_query[:fields]) association_mapping.merge!(nested_query[:association_mapping]) else nested_query = build_relation(association, value) fields.concat(nested_query[:fields]) association_mapping.merge!(nested_query[:association_mapping]) end end end
build_includes(association)
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 40 def build_includes(association) fields.concat(EagerLoadProjectionBuilder.build(association, parent_association_field, query_fields_for(association))) association_mapping[association.sfdc_association_field.downcase] = association.relation_name end
projections()
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 26 def projections relations.each do |relation| case relation when Symbol association = current_sobject.associations[relation] raise InvalidAssociationError, "Association named #{relation} was not found on #{current_sobject}" if association.nil? build_includes(association) when Hash build_hash_includes(relation) end end { fields: fields, association_mapping: association_mapping } end
query_fields_for(association)
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 45 def query_fields_for(association) return nil if query_fields.blank? query_fields_with_association = query_fields.find { |nested_field| nested_field[association.relation_name].present? } return nil if query_fields_with_association.blank? query_fields_with_association[association.relation_name].map { |field| association.relation_model.mappings[field] } end
Private Instance Methods
build_relation(association, nested_includes)
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 72 def build_relation(association, nested_includes) builder_class = ActiveForce::Association::EagerLoadProjectionBuilder.projection_builder_class(association) projection_builder = builder_class.new(association, nil, query_fields_for(association)) sub_query = projection_builder.query_with_association_fields association_mapping[association.sfdc_association_field.downcase] = association.relation_name nested_includes_query = self.class.build(nested_includes, association.relation_model, nil, query_fields) sub_query.fields nested_includes_query[:fields] { fields: ["(#{sub_query})"], association_mapping: nested_includes_query[:association_mapping] } end
build_relation_for_belongs_to(association, nested_includes)
click to toggle source
# File lib/active_force/association/eager_load_builder_for_nested_includes.rb, line 83 def build_relation_for_belongs_to(association, nested_includes) if parent_association_field.present? current_parent_association_field = "#{parent_association_field}.#{association.sfdc_association_field}" else current_parent_association_field = association.sfdc_association_field end self.class.build(nested_includes, association.relation_model, current_parent_association_field, query_fields) end