Disponible en sabor mini-plugin y en sabor Rails patch.

Se trata de una pequeña mejora al método delegate (ya sabes, ese arma casi imprescindible en la eterna lucha contra Demetrio), que incorpora un par de patrones bastante frecuentes.

Para los despistados, delegate es un método incluído en ActiveSupport que permite, eso, delegar un método en otro objeto, por ejemplo:

 class Address < AR::B
   # has attributes street and number
 end
 
 class Person < AR::B
   has_one :address
   delegate :street, :number, :to => :address
 end
 
 Person.find(1).street # 'General Patton'
 

Sin embargo esto es un poco limitado y con frecuencia nos encontrábamos sustituyéndolo por algo más engorroso para cosas sólo levemente más complejas:

 class Person
   def town
     address.city
   end
 end
 

ó:

 class Person
   def street
     address && address.street
   end
 end
 

Éste último en particular es un patrón bastante habitual. Y además es algo que preocupa a más gente porque sin buscar demasiado hemos encontrado dos propuestas de solución.

Con Hyperdelegate, estos dos ejemplos quedarían reducidos a:

 class Person
   delegate :town, :to => :city, :target => :city
   delegate :street, :to => :address, :allow_nil => true
 end
 

Como digo aparte del miniplugin hemos propuesto esta mejora al core de Rails así que si la probáis y os funciona bien y os mola votadla para que entre .