Skip to content

Instantly share code, notes, and snippets.

@tlowrimore
Created March 10, 2016 17:41
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tlowrimore/f0e3eca483395de3d373 to your computer and use it in GitHub Desktop.
Save tlowrimore/f0e3eca483395de3d373 to your computer and use it in GitHub Desktop.
Extends the functionality set forth in union_scope.rb, to include EXCEPT and INTERSECT operations
module ActiveRecord
module Scopes
module SetOperations
extend ActiveSupport::Concern
class_methods do
def union_scope(*scopes)
apply_operation 'UNION', scopes
end
def intersect_scope(*scopes)
apply_operation 'INTERSECT', scopes
end
def except_scope(*scopes)
apply_operation 'EXCEPT', scopes
end
private
def apply_operation(operation, scopes)
id_column = "#{table_name}.#{primary_key}"
sub_query = scopes
.map { |s| s.select(id_column).to_sql }
.join(" #{operation} ")
where "#{id_column} IN (#{sub_query})"
end
end
end
end
end
@dmitry
Copy link

dmitry commented Dec 17, 2019

Less problems and easier to follow:

    def union_scope(*scopes)
      scopes.inject(self) { |all, scope| all.or(where(id: scope)) }
    end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment