lib/arqo/query.rb
# frozen_string_literal: true
module ARQO
# Parent class for query objects
class Query
attr_reader :relation
delegate_missing_to :relation
def initialize(relation = associated_relation)
@relation = relation.extending(scope_module)
end
private
# Returns the model to which the query object is associated.
# By default it will infer the name from the query object's class
# assuming the name is the name of the model with "Query" as the suffix.
#
# As an example, UserQuery would be associated with the User model and
# Blog::PostQuery would be associated with the Blog::Post namespaced model.
#
# This method can be overridden to bypass this convention and associate
# the query object to another relation by returning it.
#
# ==== Example
# class PostQuery < ARQO::Query
# # ...
#
# private
#
# def associated_relation
# Blog::Post
# end
# end
#
# @return [Class, ActiveRecord::Relation]
def associated_relation
class_name = self.class.name
derived_relation_name = class_name.sub(/Query$/, '')
unless Object.const_defined?(derived_relation_name)
raise NameError, "Could not find model #{derived_relation_name} associated " \
"to query #{class_name}.\n Make sure the name is correct or override " \
'#associated_relation to provide a custom model'
end
derived_relation_name.constantize.all
end
def scope_module
"#{self.class}::Scope".constantize
end
end
end