class ActiverecordAnyOf::AlternativeBuilder::Builder
Common methods for both the positive builder and the negative one.
Attributes
queries_joins_values[RW]
Public Class Methods
new(context, *source_queries)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 29 def initialize(context, *source_queries) @context = context @source_queries = source_queries @queries_joins_values = { includes: [], joins: [], references: [] } end
Private Instance Methods
add_joins_to(relation)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 115 def add_joins_to(relation) relation = relation.references(uniq_queries_joins_values[:references]) relation = relation.includes(uniq_queries_joins_values[:includes]) relation.joins(uniq_queries_joins_values[:joins]) end
append_join_values(query)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 47 def append_join_values(query) { includes_values: :includes, joins_values: :joins, references_values: :references }.each do |q, joins| values = query.send(q) queries_joins_values[joins].concat(values) if values.any? end end
bind_values()
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 127 def bind_values queries_bind_values.tap do |values| values.map!(&:value) if IS_RAILS_6 end end
map_multiple_bind_values(query)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 74 def map_multiple_bind_values(query) query.children.map do |child| next unless child.respond_to?(:right) next unless child.right.respond_to?(:value) child.right.value end end
method_missing(method_name, *args, &block)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 107 def method_missing(method_name, *args, &block) @context.send(method_name, *args, &block) end
queries()
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 54 def queries @queries ||= @source_queries.map do |query| query = query_to_relation(query) append_join_values(query) query.arel.constraints.reduce(:and) end end
queries_bind_values()
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 97 def queries_bind_values queries.map do |query| if query.respond_to?(:children) query.children.map { |c| values_for(c) } else values_for(query) end end.flatten.compact end
query_to_relation(query)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 37 def query_to_relation(query) if query.is_a?(String) || query.is_a?(Hash) query = where(query) elsif query.is_a?(Array) query = where(*query) end query end
respond_to_missing?(method, *)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 111 def respond_to_missing?(method, *) @context.respond_to? method end
uniq_queries_joins_values()
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 62 def uniq_queries_joins_values @uniq_queries_joins_values ||= { includes: [], joins: [], references: [] }.tap do |values| queries_joins_values.each do |join_type, statements| values[join_type] = if statements.first.respond_to?(:to_sql) statements.uniq(&:to_sql) else statements.uniq end end end end
unprepare_query(query)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 121 def unprepare_query(query) query.gsub(/((?<!\\)'.*?(?<!\\)'|(?<!\\)".*?(?<!\\)")|(=\ \$\d+)/) do |match| ::Regexp.last_match(2)&.gsub(/=\ \$\d+/, '= ?') or match end end
values_for(query)
click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 83 def values_for(query) return unless query.respond_to?(:right) if query.right.is_a?(Array) values = query.right values.map!(&:value) unless IS_RAILS_6 values else return unless query.right.respond_to?(:value) query.right.value end end