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 activerecord/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 activerecord/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 activerecord/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 activerecord/lib/active_record/dynamic_matchers.rb, line 41
def prefix
  raise NotImplementedError
end
suffix() click to toggle source
# File activerecord/lib/active_record/dynamic_matchers.rb, line 45
def suffix
  ""
end

Public Instance Methods

define() click to toggle source
# File activerecord/lib/active_record/dynamic_matchers.rb, line 63
        def define
          model.class_eval <<-CODE, __FILE__, __LINE__ + 1
            def self.#{name}(#{signature})
              #{body}
            end
          CODE
        end
valid?() click to toggle source
# File activerecord/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 activerecord/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 activerecord/lib/active_record/dynamic_matchers.rb, line 73
def body
  "#{finder}(#{attributes_hash})"
end
finder() click to toggle source
# File activerecord/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 activerecord/lib/active_record/dynamic_matchers.rb, line 79
def signature
  attribute_names.map { |name| "_#{name}" }.join(", ")
end