Module: Rush::FindBy

Included in:
Array
Defined in:
lib/rush/find_by.rb

Overview

Generic find_by (returns first match) and find_all_by (returns all matches) against arrays.

Examples:

processes.find_by_pid(::Process.pid)
processes.find_all_by_cmdline(/mongrel_rails/)

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args) ⇒ Object



10
11
12
13
14
15
16
17
18
# File 'lib/rush/find_by.rb', line 10

def method_missing(meth, *args)
  if m = meth.to_s.match(/^find_by_([a-z_]+)$/)
    find_by(m[1], args.first)
  elsif m = meth.to_s.match(/^find_all_by_([a-z_]+)$/)
    find_all_by(m[1], args.first)
  else
    super
  end
end

Instance Method Details

#compare_or_match(value, against) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/rush/find_by.rb', line 32

def compare_or_match(value, against)
  if against.class == Regexp
    value.match(against) ? true : false
  else
    value == against
  end
end

#find_all_by(field, arg) ⇒ Object



26
27
28
29
30
# File 'lib/rush/find_by.rb', line 26

def find_all_by(field, arg)
  select do |item|
    item.respond_to?(field) and compare_or_match(item.send(field), arg)
  end
end

#find_by(field, arg) ⇒ Object



20
21
22
23
24
# File 'lib/rush/find_by.rb', line 20

def find_by(field, arg)
  detect do |item|
    item.respond_to?(field) and compare_or_match(item.send(field), arg)
  end
end