La memoización es una técnica muy usada como caché con duración del tiempo de vida del objeto. En Ruby es muy sencillo memoizar. Un ejemplo:
Mientras el objeto exista el método set_value solo calculará el número aleatorio una sola vez, la primera. El resto de llamadas el objeto utilizará el valor previamente guardado. Una alternativa a memoizar puede ser pasar el valor por el constructor al instanciar el objeto:
Esto tiene la diferencia de tener siempre el valor desde la instanciación pero sigue teniendo el mismo problema que la memoización cuando almacenamos relaciones del ORM.
El problema viene cuando implementaciones como esta de la técnica ORM utilizan un constructor de sentencias SQL dinámico y estos objetos son memoizados.
Un ejemplo de esto en ActiveRecord, el ORM de Rails, para una tabla de monedas podemos ver como genera diferentes consultas dependiendo de lo que necesitemos:
Si esta consulta tardase mucho o se tuviese que ejecutar muchas veces en el ciclo de vida de un objeto podríamos vernos tentados a memoizarlo. Sería un error hacerlo directamente sin guardar los datos devueltos una vez extraída la consulta ya que realizaríamos la consulta varias veces:
Para que esto no supusiese un problema deberíamos guardar el resultado de la consulta en memoria: