class Patterns::Query

Constants

RelationRequired

Attributes

base_relation[RW]
options[R]
relation[R]

Public Class Methods

call(*args) click to toggle source
# File lib/patterns/query.rb, line 24
def self.call(*args)
  new(*args).call
end
new(*args) click to toggle source
# File lib/patterns/query.rb, line 7
def initialize(*args)
  @options = args.extract_options!
  @relation = args.first || base_relation

  if relation.nil?
    raise(
      RelationRequired,
      "Queries require a base relation defined. Use .queries method to define relation."
    )
  elsif !relation.is_a?(ActiveRecord::Relation)
    raise(
      RelationRequired,
      "Queries accept only ActiveRecord::Relation as input"
    )
  end
end
queries(subject) click to toggle source
# File lib/patterns/query.rb, line 39
def self.queries(subject)
  self.base_relation = subject
end

Public Instance Methods

base_relation() click to toggle source
# File lib/patterns/query.rb, line 43
def base_relation
  return nil if self.class.base_relation.nil?

  if self.class.base_relation.is_a?(ActiveRecord::Relation)
    self.class.base_relation
  elsif self.class.base_relation < ActiveRecord::Base
    self.class.base_relation.all
  end
end
call() click to toggle source
# File lib/patterns/query.rb, line 28
def call
  query.tap do |relation|
    unless relation.is_a?(ActiveRecord::Relation)
      raise(
        RelationRequired,
        "#query method should return object of ActiveRecord::Relation class"
      )
    end
  end
end

Private Instance Methods

query() click to toggle source
# File lib/patterns/query.rb, line 61
def query
  raise(
    NotImplementedError,
    "You need to implement #query method which returns ActiveRecord::Relation object"
  )
end