Search code examples
ruby-on-railsrubylambdablock

refactor a method with a block that contains multiple blocks itself


I'm using Ruby 1.9.2

I have a class method called search that takes a block

e.g.

class MyClass
  def self.search do
    if criteria1
      keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end

    if criteria2
      keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

What I'd like to do is refactor the MyClass.search method and have a simple one-line method for each if/end statement

e.g. it would look something like this:

class MyClass

  def self.search do
    c1_method
    c2_method
  end

  def self.c1_method
    if criteria1
      return keywords "abcde", fields: :c1 do
        minimum_match(1)
      end
    end
  end

  def self.c2_method
    if criteria2
      return keywords "defghi", fields: :c2 do
        minimum_match(1)
      end
    end
  end
end

But the refactoring that I show above doesn't quite work. It looks like the "blocks" that I'm returning in c1_method and c2_method aren't really being returned and evaluated in the search method, but I'm not sure how to do that.


Solution

  • Well, you can use the method(sym) call in order to get at the body of a method.

    >> def foo(bar); bar * 2; end
    => nil
    >> def baz(bleep); method(:foo).call(bleep); end
    => nil
    >> baz(6)
    => 12