Class: ActiveRecord::UnionRelation

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

Defined Under Namespace

Classes: Error, MismatchedColumnsError, NoConfiguredSubqueriesError, Subquery

Constant Summary collapse

VERSION =
"0.4.0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(columns, discriminator) ⇒ UnionRelation

Returns a new instance of UnionRelation.



133
134
135
136
137
# File 'lib/active_record/union_relation.rb', line 133

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

Instance Attribute Details

#columnsObject (readonly)

Returns the value of attribute columns.



131
132
133
# File 'lib/active_record/union_relation.rb', line 131

def columns
  @columns
end

#discriminatorObject (readonly)

Returns the value of attribute discriminator.



131
132
133
# File 'lib/active_record/union_relation.rb', line 131

def discriminator
  @discriminator
end

#subqueriesObject (readonly)

Returns the value of attribute subqueries.



131
132
133
# File 'lib/active_record/union_relation.rb', line 131

def subqueries
  @subqueries
end

Instance Method Details

#add(relation, *sources) ⇒ Object

Adds a subquery to the overall union.



140
141
142
143
144
145
146
# File 'lib/active_record/union_relation.rb', line 140

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.



150
151
152
153
154
155
# File 'lib/active_record/union_relation.rb', line 150

def all
  raise NoConfiguredSubqueriesError if subqueries.empty?

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