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