class ActiveSet::Filtering::ActiveRecord::Strategy

Public Class Methods

new(set, attribute_instruction) click to toggle source
# File lib/active_set/filtering/active_record/strategy.rb, line 19
def initialize(set, attribute_instruction)
  @set = set
  @attribute_instruction = attribute_instruction
  @set_instruction = SetInstruction.new(attribute_instruction, set)
end

Public Instance Methods

execute() click to toggle source
# File lib/active_set/filtering/active_record/strategy.rb, line 25
def execute
  return false unless @set.respond_to? :to_sql

  if execute_filter_operation?
    statement = filter_operation
  elsif execute_intersect_operation?
    begin
      statement = intersect_operation
    rescue ArgumentError # thrown if merging a non-ActiveRecord::Relation
      return false
    end
  else
    return false
  end

  statement
end

Private Instance Methods

execute_filter_operation?() click to toggle source
# File lib/active_set/filtering/active_record/strategy.rb, line 45
def execute_filter_operation?
  return false unless attribute_model
  return false unless attribute_model.respond_to?(:attribute_names)
  return false unless attribute_model.attribute_names.include?(attribute)

  true
end
execute_intersect_operation?() click to toggle source
# File lib/active_set/filtering/active_record/strategy.rb, line 53
def execute_intersect_operation?
  return false unless attribute_model
  return false unless attribute_model.respond_to?(attribute)
  return false if attribute_model.method(attribute).arity.zero?

  true
end
filter_operation() click to toggle source
# File lib/active_set/filtering/active_record/strategy.rb, line 61
def filter_operation
  initial_relation
    .where(
      query_column.send(
        arel_operator,
        query_value
      )
    )
end
intersect_operation() click to toggle source
# File lib/active_set/filtering/active_record/strategy.rb, line 71
def intersect_operation
  # NOTE: If merging relations that contain duplicate column conditions,
  # the second condition will replace the first.
  # e.g. Thing.where(id: [1,2]).merge(Thing.where(id: [2,3]))
  # => [Thing<2>, Thing<3>] NOT [Thing<2>]
  initial_relation
    .merge(
      attribute_model.public_send(
        attribute,
        query_value
      )
    )
end