class ParamsReady::Query::ExistsPredicate

Public Instance Methods

test(record) click to toggle source
Calls superclass method
# File lib/params_ready/query/exists_predicate.rb, line 36
def test(record)
  return nil unless is_definite?

  collection = dig(record, definition.path_to_collection)

  result = if collection.nil?
    false
  else
    collection.any? do |item|
      super item
    end
  end

  if definition.has_child?(:existence) && self[:existence].unwrap == :none
    !result
  else
    result
  end
end
to_query(query_table, context: Restriction.blanket_permission) click to toggle source
# File lib/params_ready/query/exists_predicate.rb, line 10
def to_query(query_table, context: Restriction.blanket_permission)
  query_table = definition.outer_table || query_table

  subquery_table = self.definition.arel_table
  raise ParamsReadyError, "Arel table for '#{name}' not set" if subquery_table.nil?

  predicates = predicate_group(subquery_table, context: context)

  join_clause = self.related query_table, subquery_table, context
  subquery = GroupingOperator.instance(:and).connect(predicates, join_clause)
  select = subquery_table.where(subquery)
  query = select.take(1).project(Arel.star).exists
  if definition.has_child?(:existence) && self[:existence].unwrap == :none
    query.not
  else
    query
  end
end