Class: ActiveRecord::UnionRelation

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/union_relation.rb,
lib/active_record/union_relation/version.rb

Defined Under Namespace

Classes: Error, MismatchedColumnsError, NoConfiguredSubqueriesError, Subquery

Constant Summary collapse

VERSION =
'0.1.0'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(columns, discriminator) ⇒ UnionRelation

Returns a new instance of UnionRelation.



68
69
70
71
72
# File 'lib/active_record/union_relation.rb', line 68

def initialize(columns, discriminator)
  @columns = columns.map(&:to_s)
  @discriminator = discriminator
  @subqueries = []
end

Instance Attribute Details

#columnsObject (readonly)

Returns the value of attribute columns.



66
67
68
# File 'lib/active_record/union_relation.rb', line 66

def columns
  @columns
end

#discriminatorObject (readonly)

Returns the value of attribute discriminator.



66
67
68
# File 'lib/active_record/union_relation.rb', line 66

def discriminator
  @discriminator
end

#subqueriesObject (readonly)

Returns the value of attribute subqueries.



66
67
68
# File 'lib/active_record/union_relation.rb', line 66

def subqueries
  @subqueries
end

Instance Method Details

#add(relation, *sources) ⇒ Object

Adds a subquery to the overall union.



75
76
77
78
79
80
81
# File 'lib/active_record/union_relation.rb', line 75

def add(relation, *sources)
  if columns.length != sources.length
    raise MismatchedColumnsError.new(columns, sources)
  end

  subqueries << Subquery.new(relation, sources)
end

#allObject

Creates an ActiveRecord::Relation object that will pull all of the subqueries together.



85
86
87
88
89
90
# File 'lib/active_record/union_relation.rb', line 85

def all
  raise NoConfiguredSubqueriesError if subqueries.empty?

  model = subqueries.first.relation.model
  subclass_for(model).from(union_for(model)).select(discriminator, *columns)
end