class Ransack::Visitor

Constants

DISPATCH

Public Instance Methods

accept(object) click to toggle source
# File lib/ransack/visitor.rb, line 4
def accept(object)
  visit(object)
end
can_accept?(object) click to toggle source
# File lib/ransack/visitor.rb, line 8
def can_accept?(object)
  respond_to? DISPATCH[object.class]
end
quoted?(object) click to toggle source
# File lib/ransack/visitor.rb, line 44
def quoted?(object)
  case object
  when Arel::Nodes::SqlLiteral, Bignum, Fixnum
    false
  else
    true
  end
end
visit(object) click to toggle source
# File lib/ransack/visitor.rb, line 53
def visit(object)
  send(DISPATCH[object.class], object)
end
visit_Array(object) click to toggle source
# File lib/ransack/visitor.rb, line 12
def visit_Array(object)
  object.map { |o| accept(o) }.compact
end
visit_Ransack_Nodes_Condition(object) click to toggle source
# File lib/ransack/visitor.rb, line 16
def visit_Ransack_Nodes_Condition(object)
  object.arel_predicate if object.valid?
end
visit_Ransack_Nodes_Grouping(object) click to toggle source
# File lib/ransack/visitor.rb, line 20
def visit_Ransack_Nodes_Grouping(object)
  if object.combinator == Constants::OR
    visit_or(object)
  else
    visit_and(object)
  end
end
visit_Ransack_Nodes_Sort(object) click to toggle source
# File lib/ransack/visitor.rb, line 57
def visit_Ransack_Nodes_Sort(object)
  if object.valid?
    if object.attr.is_a?(Arel::Attributes::Attribute)
      object.attr.send(object.dir)
    else
      ordered(object)
    end
  else
    scope_name = :"sort_by_#{object.name}_#{object.dir}"
    scope_name if object.context.object.respond_to?(scope_name)
  end
end
visit_and(object) click to toggle source
# File lib/ransack/visitor.rb, line 28
def visit_and(object)
  nodes = object.values.map { |o| accept(o) }.compact
  return nil unless nodes.size > 0

  if nodes.size > 1
    Arel::Nodes::Grouping.new(Arel::Nodes::And.new(nodes))
  else
    nodes.first
  end
end
visit_or(object) click to toggle source
# File lib/ransack/visitor.rb, line 39
def visit_or(object)
  nodes = object.values.map { |o| accept(o) }.compact
  nodes.inject(&:or)
end

Private Instance Methods

ordered(object) click to toggle source
# File lib/ransack/visitor.rb, line 78
def ordered(object)
  case object.dir
  when 'asc'.freeze
    Arel::Nodes::Ascending.new(object.attr)
  when 'desc'.freeze
    Arel::Nodes::Descending.new(object.attr)
  end
end