class MongoidEmbedFinder::Runner

Public Class Methods

new(child_class, parent_relation_name) click to toggle source
# File lib/mongoid_embed_finder/runner.rb, line 8
def initialize(child_class, parent_relation_name)
  @relation_discovery = RelationDiscovery.new(
    child_class, parent_relation_name)
end

Public Instance Methods

first(parent: {}, **attrs) click to toggle source
# File lib/mongoid_embed_finder/runner.rb, line 13
def first(parent: {}, **attrs)
  nested_attrs = find_first(attrs, parent: parent)
  return nil unless nested_attrs
  build_child_with_parent(nested_attrs)
end

Private Instance Methods

build_child_with_parent(nested_attrs) click to toggle source
# File lib/mongoid_embed_finder/runner.rb, line 41
def build_child_with_parent(nested_attrs)
  builder = NestedBuilder.new(nested_attrs, relations)
  builder.build_child
end
build_nested_query(attrs = {}, parent: {}) click to toggle source
# File lib/mongoid_embed_finder/runner.rb, line 27
def build_nested_query(attrs = {}, parent: {})
  parent_criteria = relations.parent_class.criteria
  child_criteria  = relations.child_class.criteria

  NestedQuery.new(parent_criteria, child_criteria).tap do |query|
    query.scope_parent(parent.except(:include_fields))
    query.scope_child(attrs)
  end
end
find_first(attrs = {}, parent: {}) click to toggle source
# File lib/mongoid_embed_finder/runner.rb, line 21
def find_first(attrs = {}, parent: {})
  query = build_nested_query(attrs, parent: parent)
  project_query(query, Projectors::Single,
    parent_fields: parent.fetch(:include_fields, [])).first
end
project_query(query, projector_class, parent_fields: []) click to toggle source
# File lib/mongoid_embed_finder/runner.rb, line 37
def project_query(query, projector_class, parent_fields: [])
  projector_class.new(query, relations.children).project(parent_fields)
end
relations() click to toggle source
# File lib/mongoid_embed_finder/runner.rb, line 46
def relations
  @relation_discovery.relations
end