Sha256: 7a63023958eba78cd44fd5fe0df5b059a5734d5ef4b12d2d6515ead6ab256150

Contents?: true

Size: 938 Bytes

Versions: 9

Compression:

Stored size: 938 Bytes

Contents

module ESA
  module Traits
    #
    # https://gist.github.com/tlowrimore/5257360
    # 
    # OR's together provided scopes, returning an ActiveRecord::Relation.
    # This implementation is smart enough to not only handle your _where_
    # clauses, but it also takes care of your joins!
    #
    module OrScope
      def self.included(base)
        base.send :extend, ClassMethods
      end

      module ClassMethods
        def or_scope(*scopes)
          conditions = 
            scopes
              .map { |scope| "(#{scope.where_clauses.map{ |clause| "(#{clause})"}.join(" AND ")})" }
              .join(" OR ")
              
          relationships =
            scopes
              .map { |scope| scope.joins_values }
              .flatten
              .uniq
              
          joins(*relationships).where(conditions)
        end
      end
    end
  end
end

ActiveRecord::Base.send :include, ESA::Traits::OrScope

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
event_sourced_accounting-0.2.6 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.2.4 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.2.3 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.2.2 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.1.6 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.1.4 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.1.3 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.1.1 app/models/esa/traits/or_scope.rb
event_sourced_accounting-0.1.0 app/models/esa/traits/or_scope.rb