class ActiveRecord::QueryMethods::WhereChain

Public Instance Methods

all(opts, *rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 44
def all(opts, *rest)
  equality_to_function('ALL', opts, rest)
end
any(opts, *rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 40
def any(opts, *rest)
  equality_to_function('ANY', opts, rest)
end
contained_within(opts, *rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 8
def contained_within(opts, *rest)
  substitute_comparisons(opts, rest, Arel::Nodes::ContainedWithin, 'contained_within')
end
contained_within_or_equals(opts, *rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 12
def contained_within_or_equals(opts, *rest)
  substitute_comparisons(opts, rest, Arel::Nodes::ContainedWithinEquals, 'contained_within_or_equals')
end
contains(opts, *rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 16
def contains(opts, *rest)
  build_where_chain(opts, rest) do |rel|
    case rel
    when Arel::Nodes::In, Arel::Nodes::Equality
      column = left_column(rel) || column_from_association(rel)
      equality_for_hstore(rel) if column.type == :hstore

      if column.type == :hstore
        Arel::Nodes::ContainsHStore.new(rel.left, rel.right)
      elsif column.respond_to?(:array) && column.array
        Arel::Nodes::ContainsArray.new(rel.left, rel.right)
      else
        Arel::Nodes::ContainsINet.new(rel.left, rel.right)
      end
    else
      raise ArgumentError, "Invalid argument for .where.overlap(), got #{rel.class}"
    end
  end
end
contains_or_equals(opts, *rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 36
def contains_or_equals(opts, *rest)
  substitute_comparisons(opts, rest, Arel::Nodes::ContainsEquals, 'contains_or_equals')
end
overlap(opts, *rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 4
def overlap(opts, *rest)
  substitute_comparisons(opts, rest, Arel::Nodes::Overlap, 'overlap')
end

Private Instance Methods

build_where_chain(opts, rest, &block) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 85
def build_where_chain(opts, rest, &block)
  where_value = @scope.send(:build_where, opts, rest).map(&block)
  @scope.references!(PredicateBuilder.references(opts)) if Hash === opts
  @scope.where_values += where_value
  @scope
end
column_from_association(rel) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 58
def column_from_association(rel)
  if assoc = assoc_from_related_table(rel)
    column = assoc.klass.columns.find { |col| find_column(col, rel) }
  end
end
equality_for_hstore(rel) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 64
def equality_for_hstore(rel)
  new_right_name = rel.left.name.to_s
  if rel.right.respond_to?(:val)
    return if rel.right.val.is_a?(Hash)
    rel.right = Arel::Nodes.build_quoted({new_right_name => rel.right.val},
                                         rel.left)
  else
    return if rel.right.is_a?(Hash)
    rel.right = {new_right_name => rel.right }
  end

  rel.left.name = rel.left.relation.name.to_sym
  rel.left.relation.name = rel.left.relation.engine.table_name
end
equality_to_function(function_name, opts, rest) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 103
def equality_to_function(function_name, opts, rest)
  build_where_chain(opts, rest) do |rel|
    case rel
    when Arel::Nodes::Equality
      Arel::Nodes::Equality.new(rel.right, Arel::Nodes::NamedFunction.new(function_name, [rel.left]))
    else
      raise ArgumentError, "Invalid argument for .where.#{function_name.downcase}(), got #{rel.class}"
    end
  end
end
find_column(col, rel) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 50
def find_column(col, rel)
  col.name == rel.left.name.to_s || col.name == rel.left.relation.name.to_s
end
left_column(rel) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 54
def left_column(rel)
  rel.left.relation.engine.columns.find { |col| find_column(col, rel) }
end
substitute_comparisons(opts, rest, arel_node_class, method) click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 92
def substitute_comparisons(opts, rest, arel_node_class, method)
  build_where_chain(opts, rest) do |rel|
    case rel
    when Arel::Nodes::In, Arel::Nodes::Equality
      arel_node_class.new(rel.left, rel.right)
    else
      raise ArgumentError, "Invalid argument for .where.#{method}(), got #{rel.class}"
    end
  end
end