# class ActiveRecord::DynamicMatchers::Method

### Attributes

matchers[R]
attribute_names[R]
model[R]
name[R]

### Public Class Methods

match(model, name) click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 32
    def match(model, name)
      klass = matchers.find { |k| k.pattern.match?(name) }
      klass.new(model, name) if klass
    end

new(model, name) click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 52
    def initialize(model, name)
      @model           = model
      @name            = name.to_s
      @attribute_names = @name.match(self.class.pattern)[1].split("_and_")
      @attribute_names.map! { |n| @model.attribute_aliases[n] || n }
    end

pattern() click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 37
    def pattern
      @pattern ||= /\A#{prefix}_([_a-zA-Z]\w*)#{suffix}\Z/
    end

prefix() click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 41
    def prefix
      raise NotImplementedError
    end

suffix() click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 45
    def suffix
      ""
    end

### Public Instance Methods

define() click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 63
            def define
              model.class_eval "            def self.#{name}(#{signature})
                  #{body}
                end
    ", __FILE__, __LINE__ + 1
            end

valid?() click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 59
    def valid?
      attribute_names.all? { |name| model.columns_hash[name] || model.reflect_on_aggregation(name.to_sym) }
    end

### Private Instance Methods

attributes_hash() click to toggle source

Given that the parameters starts with `_`, the finder needs to use the same parameter name.

    # File lib/active_record/dynamic_matchers.rb, line 85
    def attributes_hash
      "{" + attribute_names.map { |name| ":#{name} => _#{name}" }.join(",") + "}"
    end

body() click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 73
    def body
      "#{finder}(#{attributes_hash})"
    end

finder() click to toggle source

    # File lib/active_record/dynamic_matchers.rb, line 89
    def finder
      raise NotImplementedError
    end

signature() click to toggle source

The parameters in the signature may have reserved Ruby words, in order to prevent errors, we start each param name with `_`.

    # File lib/active_record/dynamic_matchers.rb, line 79
    def signature
      attribute_names.map { |name| "_#{name}" }.join(", ")
    end