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 64 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 60 def any(opts, *rest) equality_to_function('ANY', opts, rest) end
contained_in_array(opts, *rest)
click to toggle source
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 36 def contained_in_array(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::ContainedInHStore.new(rel.left, rel.right) elsif column.respond_to?(:array) && column.array Arel::Nodes::ContainedInArray.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
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 56 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 105 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 78 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 84 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 123 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 70 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 74 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 112 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