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 31
def match(model, name)
  klass = matchers.find { |k| name =~ k.pattern }
  klass.new(model, name) if klass
end
new(model, name) click to toggle source
# File lib/active_record/dynamic_matchers.rb, line 51
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 36
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 40
def prefix
  raise NotImplementedError
end
suffix() click to toggle source
# File lib/active_record/dynamic_matchers.rb, line 44
def suffix
  ''
end

Public Instance Methods

define() click to toggle source
# File lib/active_record/dynamic_matchers.rb, line 62
      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 58
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 84
def attributes_hash
  "{" + attribute_names.map { |name| ":#{name} => _#{name}" }.join(',') + "}"
end
body() click to toggle source
# File lib/active_record/dynamic_matchers.rb, line 72
def body
  "#{finder}(#{attributes_hash})"
end
finder() click to toggle source
# File lib/active_record/dynamic_matchers.rb, line 88
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 78
def signature
  attribute_names.map { |name| "_#{name}" }.join(', ')
end