class MetasploitDataModels::Search::Visitor::Relation
Generates a `ActiveRecord::Relation` from an `Metasploit::Model::Search::Query#tree`
Constants
- RELATION_METHODS
`ActiveRecord::Relation` methods that can compute their argument with a visitor under the {MetasploitDataModels::Search::Visitor} namespace.
Attributes
@!attribute [rw] query
The query to visit. Query supplies Class with #scope upon which to build `ActiveRecord::Relation`. @return [Metasploit::Model::Search::Query]
Public Class Methods
Maps method on `ActiveRecord::Relation` to the `Class` under {MetasploitDataModels::Search::Visitor} whose `#visit` method can produce the arguments to the `ActiveRecord::Relation` method.
@return [Hash{Symbol => Class}]
# File app/models/metasploit_data_models/search/visitor/relation.rb, line 68 def self.visitor_class_by_relation_method @relation_method_by_visitor_class ||= RELATION_METHODS.each_with_object({}) { |relation_method, relation_method_by_visitor_class| visitor_class_name = "#{parent.name}::#{relation_method.to_s.camelize}" visitor_class = visitor_class_name.constantize relation_method_by_visitor_class[relation_method] = visitor_class } end
Public Instance Methods
Visits {#query} tree to produce an `ActiveRecord::Relation` on the `Metasploit::Model::Search::Query#klass`.
@return [ActiveRecord::Relation]
# File app/models/metasploit_data_models/search/visitor/relation.rb, line 41 def visit tree = query.tree # Enumerable#inject does not support 3 arity for Hashes so need to unpack pair visitor_by_relation_method.inject(query.klass.all) do |relation, pair| relation_method, visitor = pair visited = visitor.visit(tree) relation.send(relation_method, visited) end end
Map method on `ActiveRecord::Relation` to visitor that can visit `Metasploit::Model::Search::Query#tree` to produce the arguments to the method on `ActiveRecord::Relation`.
@return [Hash{Symbol => visit}]
# File app/models/metasploit_data_models/search/visitor/relation.rb, line 56 def visitor_by_relation_method # Enumerable#each_with_object does not support 3 arity for Hashes so need to unpack pair @visitor_by_relation_method ||= self.class.visitor_class_by_relation_method.each_with_object({}) { |pair, visitor_by_relation_method| relation_method, visitor_class = pair visitor_by_relation_method[relation_method] = visitor_class.new } end
Private Instance Methods
Validates that {#query} is valid.
@return [void]
# File app/models/metasploit_data_models/search/visitor/relation.rb, line 82 def valid_query if query and !query.valid? errors.add(:query, :invalid) end end