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, method_name)
click to toggle source
# File 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
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 <<-CODE, __FILE__, __LINE__ + 1 def self.#{name}(#{signature}) #{body} end CODE 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 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