Sha256: 811ea231800ce83721c35f09e427d9d50dbbd2d7b8d8dc167e90387f9569a708

Contents?: true

Size: 1.38 KB

Versions: 7

Compression:

Stored size: 1.38 KB

Contents

require "active_record"

module Patterns
  class Query
    RelationRequired = Class.new(StandardError)

    def initialize(*args)
      @options = args.extract_options!
      @relation = args.first || self.class.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

    def self.call(*args)
      new(*args).call
    end

    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

    def self.queries(subject)
      self.base_relation =
        if subject.is_a?(ActiveRecord::Relation)
          subject
        elsif subject < ActiveRecord::Base
          subject.all
        end
    end

    private

    class << self
      attr_accessor :base_relation
    end

    attr_reader :relation, :options

    def query
      raise(
          NotImplementedError,
          "You need to implement #query method which returns ActiveRecord::Relation object"
      )
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
rails-patterns-0.5.0 lib/patterns/query.rb
rails-patterns-0.4.1 lib/patterns/query.rb
rails-patterns-0.4.0 lib/patterns/query.rb
rails-patterns-0.3.0 lib/patterns/query.rb
rails-patterns-0.2.0 lib/patterns/query.rb
rails-patterns-0.1.1 lib/patterns/query.rb
rails-patterns-0.1.0 lib/patterns/query.rb