123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::DynamicMatchers::Method

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Inherits: Object
Defined in: activerecord/lib/active_record/dynamic_matchers.rb

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

  • #define
  • #attributes_hash private

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

  • #body private
  • #finder private
  • #signature private

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

Constructor Details

.new(model, method_name) ⇒ Method

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 52

def initialize(model, method_name)
  @model           = model
  @name            = method_name.to_s
  @attribute_names = @name.match(self.class.pattern)[1].split("_and_")
  @attribute_names.map! { |name| @model.attribute_aliases[name] || name }
end

Class Attribute Details

.matchers (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 30

attr_reader :matchers

Class Method Details

.match(model, name)

[ GitHub ]

  
# 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

.pattern

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 37

def pattern
  @pattern ||= /\A#{prefix}_([_a-zA-Z]\w*)#{suffix}\Z/
end

.prefix

Raises:

  • (NotImplementedError)
[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 41

def prefix
  raise NotImplementedError
end

.suffix

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 45

def suffix
  ""
end

Instance Attribute Details

#attribute_names (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 50

attr_reader :model, :name, :attribute_names

#model (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 50

attr_reader :model, :name, :attribute_names

#name (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 50

attr_reader :model, :name, :attribute_names

#valid?Boolean (readonly)

[ GitHub ]

  
# 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

Instance Method Details

#attributes_hash (private)

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

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 84

def attributes_hash
  "{" + attribute_names.map { |name| ":#{name} => _#{name}" }.join(",") + "}"
end

#body (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 72

def body
  "#{finder}(#{attributes_hash})"
end

#define

[ GitHub ]

  
# 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

#finder (private)

Raises:

  • (NotImplementedError)
[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 88

def finder
  raise NotImplementedError
end

#signature (private)

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

[ GitHub ]

  
# File 'activerecord/lib/active_record/dynamic_matchers.rb', line 78

def signature
  attribute_names.map { |name| "_#{name}" }.join(", ")
end