Module: ActiveRecord::QueryMethods

Defined in:
lib/referrable_joins/active_record_hacks.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#inner_joins_valuesObject

Returns the value of attribute inner_joins_values.



128
129
130
# File 'lib/referrable_joins/active_record_hacks.rb', line 128

def inner_joins_values
  @inner_joins_values
end

#outer_joins_valuesObject

Returns the value of attribute outer_joins_values.



128
129
130
# File 'lib/referrable_joins/active_record_hacks.rb', line 128

def outer_joins_values
  @outer_joins_values
end

Instance Method Details

#build_arelObject



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/referrable_joins/active_record_hacks.rb', line 151

def build_arel
  arel = table
  
  @inner_joins_values||=[]
  @outer_joins_values||=[]
  
  arel = build_joins(arel, @inner_joins_values, @outer_joins_values) unless @outer_joins_values.blank? && @inner_joins_values.blank?

  (@where_values - ['']).uniq.each do |where|
    where = Arel.sql(where) if String === where
    arel = arel.where(Arel::Nodes::Grouping.new(where))
  end

  arel = arel.having(*@having_values.uniq.reject{|h| h.blank?}) unless @having_values.empty?

  arel = arel.take(@limit_value) if @limit_value
  arel = arel.skip(@offset_value) if @offset_value

  arel = arel.group(*@group_values.uniq.reject{|g| g.blank?}) unless @group_values.empty?

  arel = arel.order(*@order_values.uniq.reject{|o| o.blank?}) unless @order_values.empty?

  arel = build_select(arel, @select_values.uniq)

  arel = arel.from(@from_value) if @from_value
  arel = arel.lock(@lock_value) if @lock_value

  arel
end

#build_joins(relation, inner_joins, outer_joins) ⇒ Object



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/referrable_joins/active_record_hacks.rb', line 182

def build_joins(relation, inner_joins, outer_joins)
  inner_association_joins = []
  outer_association_joins = []

  inner_joins = @inner_joins_values.map {|j| j.respond_to?(:strip) ? j.strip : j}.uniq
  outer_joins = @outer_joins_values.map {|j| j.respond_to?(:strip) ? j.strip : j}.uniq

  inner_joins.each do |join|
    inner_association_joins << join if [Hash, Array, Symbol, ActiveRecord::ReflectionTable].include?(join.class) && !array_of_strings?(join)
  end

  outer_joins.each do |join|
    outer_association_joins << join if [Hash, Array, Symbol, ActiveRecord::ReflectionTable].include?(join.class) && !array_of_strings?(join)
  end

  stashed_association_joins = (inner_joins + outer_joins).grep(ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation)

  non_association_joins = (outer_joins + inner_joins - outer_association_joins - inner_association_joins - stashed_association_joins)
  custom_joins = custom_join_sql(*non_association_joins)

  join_dependency = ActiveRecord::Associations::ClassMethods::JoinDependency.new(@klass, inner_association_joins, outer_association_joins, custom_joins)

  join_dependency.graft(*stashed_association_joins)

  @implicit_readonly = true unless inner_association_joins.empty? && outer_association_joins.empty? && stashed_association_joins.empty?

  to_join = []

  join_dependency.join_associations.each do |association|
    if (association_relation = association.relation).is_a?(Array)
      to_join << [association_relation.first, association.join_type, association.association_join.first]
      to_join << [association_relation.last, association.join_type, association.association_join.last]
    else
      to_join << [association_relation, association.join_type, association.association_join]
    end
  end

  to_join.uniq.each do |left, join_type, right|
    relation = relation.join(left, join_type).on(*right)
  end

  relation.join(custom_joins)
end

#joins(*args) ⇒ Object Also known as: inner_joins



130
131
132
133
134
135
136
137
138
# File 'lib/referrable_joins/active_record_hacks.rb', line 130

def joins(*args)
  relation = clone

  args.flatten!
  relation.inner_joins_values ||= []
  relation.inner_joins_values += args unless args.blank?

  relation
end

#outer_joins(*args) ⇒ Object



141
142
143
144
145
146
147
148
149
# File 'lib/referrable_joins/active_record_hacks.rb', line 141

def outer_joins(*args)
  relation = clone

  args.flatten!
  relation.outer_joins_values ||= []
  relation.outer_joins_values += args unless args.blank?

  relation
end