There is a current class conception in Ruby, according to Metaprogramming Ruby 2
Wherever you are in a Ruby program, you always have a current object: self. Likewise, you always have a current class (or module). As The Ruby interpreter always keeps a reference to the current class (or module), when you define a method, that method becomes an instance method of the current class.
And it changes with the class and module keyword.
When you open a class with the class keyword (or a module with the module keyword), that class becomes the current class.
So in your case, the current class of where run method defined is still RansackHelpers, but not RansackHelpers's singleton class.
Here it works,
module RansackHelpers
class << self
def split(attribute, model_class)
def run(memo, model_class, attribute)
# Code
end
run([], model_class, attribute)
end
end
end