viernes, 26 de diciembre de 2008

Redefinir el método de comparación con expresiones regulares

Para mejorar la búsqueda en los datos de los objetos se puede aprovechar que en ruby se puede redefinir el método de comparación con expresiones regulares (=~).

Un ejemplo.

class Persona
attr_accessor :nombre, :apellidos, :direccion

def initialize(nombre, apellidos, direccion)
self.nombre = nombre
self.apellidos = apellidos
self.direccion = direccion
end

def =~(re)
"#{self.nombre} #{self.apellidos} #{self.direccion}" =~ re
end

def self.search(ciudad, input)
query = Regexp.new(input, 'i')
ciudad.select{|p| p =~ query}
end
end



p1 = Persona.new('Jose', 'Gonzalez', 'Sol')
p2 = Persona.new('Francisco', 'Martinez', 'Preciados')
p3 = Persona.new('Fernando', 'Solano', 'Serrano')

Madrid = [p1, p2, p3]

puts Persona.search(Madrid, 'sol').map(&:nombre)

El modificador 'i' del constructor de expresiones regulares hace que no distinga entre mayúsculas y minúsculas.
Concatenando los campos en los que queremos buscar se obtiene un matching más completo.

Con el map final se imprimen los nombres de las personas que hayan coincidido con la búsqueda.

0 comentarios: