<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El Futirifoken &#187; active record</title>
	<atom:link href="http://www.gazer.com.ar/tag/active-record/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gazer.com.ar</link>
	<description>El arte de no decir nada ;-)</description>
	<lastBuildDate>Mon, 26 Dec 2011 19:56:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Migrando datos desde PHP a Rails</title>
		<link>http://www.gazer.com.ar/2010/01/22/migrando-datos-desde-php-a-rails/</link>
		<comments>http://www.gazer.com.ar/2010/01/22/migrando-datos-desde-php-a-rails/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 20:02:41 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[migracion]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=1227</guid>
		<description><![CDATA[Por esas cosas de la vida me encontré todo el día de hoy migrando datos viejos de un sistema hecho en PHP a uno hecho en Rails. Las cosas venían bastante simples definiendo modelos de ActiveRecord para las tablas de la base de datos vieja y reinsertando con modelos apuntando a las tablas nuevas. Pero [...]]]></description>
			<content:encoded><![CDATA[<p>Por esas cosas de la vida me encontré todo el día de hoy migrando datos viejos de un sistema hecho en PHP a uno hecho en Rails. Las cosas venían bastante simples definiendo modelos de ActiveRecord para las tablas de la base de datos vieja y reinsertando con modelos apuntando a las tablas nuevas. Pero &#8230; siempre hay un pero.</p>
<p>Resulta que el hermoso sistema anterior para evitar tener muchas tablas (o vaya a saber por qué) tenía en una parte un tabla donde cada field era un gran TEXT que contenía un array de PHP <a href="http://php.net/manual/en/function.serialize.php" target="_blank">serializado</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> UserTextField <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  set_table_name <span style="color:#996600;">&quot;usertextfield&quot;</span>
  set_primary_key <span style="color:#996600;">&quot;userid&quot;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> folders
    field3
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
$<span style="color:#006600; font-weight:bold;">&gt;</span> user = UserTextField.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span>
$<span style="color:#006600; font-weight:bold;">&gt;</span> user.<span style="color:#9900CC;">folders</span> <span style="color:#008000; font-style:italic;"># =&gt; 'a:2:{i:0;s:4:&quot;bkps&quot;;i:1;s:6:&quot;listas&quot;;'</span></pre></div></div>

<p>Justo cuando estaba por ponerme a parsear texto me encontré con <a href="http://github.com/jqr/php-serialize">php-serialize</a> que permite serializar y deserializar estos string en cómodos tipos nativos de Ruby.</p>
<p>El código final queda entonces algo como :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> UserTextField <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  set_table_name <span style="color:#996600;">&quot;usertextfield&quot;</span>
  set_primary_key <span style="color:#996600;">&quot;userid&quot;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> folders
    PHP.<span style="color:#9900CC;">unserialize</span><span style="color:#006600; font-weight:bold;">&#40;</span>field3<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
$<span style="color:#006600; font-weight:bold;">&gt;</span> user = UserTextField.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span>
$<span style="color:#006600; font-weight:bold;">&gt;</span> user.<span style="color:#9900CC;">folders</span> <span style="color:#008000; font-style:italic;"># =&gt; [&quot;bkps&quot;, &quot;listas&quot;]</span></pre></div></div>

<p>Y la migración de datos pudo continuar sin problemas <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2010/01/22/migrando-datos-desde-php-a-rails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Delegando atributos de ActiveRecord</title>
		<link>http://www.gazer.com.ar/2008/11/04/delegando-atributos-de-activerecord/</link>
		<comments>http://www.gazer.com.ar/2008/11/04/delegando-atributos-de-activerecord/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 03:09:49 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=483</guid>
		<description><![CDATA[El otro día tratando de mejorar un modelo de una aplicación me topé con el problema de tener muchos atributos virtuales para poder acceder a atributos de un objeto relacionado y no caer en lo siguiente : class Player &#60; ActiveRecord::Base belongs_to :user &#160; def name user.name end &#160; def email user.email end &#160; # [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día tratando de mejorar un modelo de una aplicación me topé con el problema de tener muchos atributos virtuales para poder acceder a atributos de un objeto relacionado y no caer en lo siguiente :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Player <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:user</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> name
    user.<span style="color:#9900CC;">name</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> email
    user.<span style="color:#9900CC;">email</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># ... y varios más</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Esto no lo puedo evitar mucho ya que <code>Player</code> es una clase intermedia en una relación de N-M entre los usuarios y los partidos, y además contiene información necesaria para la lógica del modelo.</p>
<p>Tampoco era muy feliz tener por todos lados <em><a href="http://sis36.berkeley.edu/projects/streek/agile/bad-smells-in-code.html#Message+Chains">Message Chains</a></em>:</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@player</span>.<span style="color:#9900CC;">user</span>.<span style="color:#9900CC;">name</span>
<span style="color:#0066ff; font-weight:bold;">@player</span>.<span style="color:#9900CC;">user</span>.<span style="color:#9900CC;">email</span>
<span style="color:#008000; font-style:italic;"># etc ....</span></pre></div></div>

<p>Una de las recomendaciones que se usan en estos casos es <a href="http://www.refactoring.com/catalog/hideDelegate.html">Hide Delegate</a> para ocultarle al cliente de donde sale el dato realmente. Cabe aclarar que no siempre son un problema las llamadas encadenadas.</p>
<p>Recordando el anuncio de Rails 2.2 noté que al final hablaba de un delegate que tenía un nuevo feature. Buscando un rato por google encontré <a href="http://craigjolicoeur.com/blog/2007/05/activerecord-delegate-attributes/">este</a> post donde hablaba de un método delegate para hacer justamente esto que yo quería.</p>
<p>Lo extraño, que también menciona el autor es que no está documentado en la <a href="http://api.rubyonrails.org/">API</a> oficial de Rails aunque mirando el código veo que explica como usarla. Explícitamente dice :</p>
<blockquote><p>
Provides a delegate class method to easily expose contained objects' methods as your own
</p></blockquote>
<p>En la documentación también aclara que es útil tanto para atributos propios como para asociaciones entre diferentes instancias de ActiveRecord. La realidad es que por cómo está implementada funciona para cualquier objeto ruby que se nos ocurra.</p>
<p>El ejemplo con el que empezamos el post quedaría resumido a :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Player <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:user</span>
  delegate <span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:email</span>, ... , <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:user</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Quedando mucho más corto el código, por lo tanto más fácil de mantener.</p>
<p>Tomando prestado los ejemplos del otro blog, también podemos hacer cosas con atributos que no son asociaciones, como por ejemplo una fecha :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Forma abreviada</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Content <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  delegate <span style="color:#ff3333; font-weight:bold;">:year</span>, <span style="color:#ff3333; font-weight:bold;">:month</span>, <span style="color:#ff3333; font-weight:bold;">:day</span>, <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:published_at</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Forma desglosada</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Content <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  delegate <span style="color:#ff3333; font-weight:bold;">:year</span>, <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:published_at</span>
  delegate <span style="color:#ff3333; font-weight:bold;">:month</span>, <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:published_at</span>
  delegate <span style="color:#ff3333; font-weight:bold;">:day</span>, <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:published_at</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Podemos escribir</span>
<span style="color:#0066ff; font-weight:bold;">@content</span>.<span style="color:#9900CC;">year</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># en lugar de</span>
<span style="color:#0066ff; font-weight:bold;">@content</span>.<span style="color:#9900CC;">published_at</span>.<span style="color:#9900CC;">year</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2008/11/04/delegando-atributos-de-activerecord/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lo que viene en Rails 2.2</title>
		<link>http://www.gazer.com.ar/2008/10/27/lo-que-viene-en-rails-2-2/</link>
		<comments>http://www.gazer.com.ar/2008/10/27/lo-que-viene-en-rails-2-2/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 14:58:24 +0000</pubDate>
		<dc:creator>Gazer</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.gazer.com.ar/?p=430</guid>
		<description><![CDATA[Hace poco se anunció el RC1 de lo que será la versión 2.2 de Ruby on Rails. Si bien la fecha de salida es &#8220;cuando esté lista&#8221;, ya se pueden utilizar para aquellos que gusten vivir &#8220;on the edge&#8221;. Para aquellos que quieran un rejunte completo de todo lo que se viene pueden ver el [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco se anunció el RC1 de lo que será la versión <a href="http://guides.rubyonrails.org/2_2_release_notes.html">2.2</a> de <a href="http://www.rubyonrails.com/">Ruby on Rails</a>. Si bien la fecha de salida es &#8220;cuando esté lista&#8221;, ya se pueden utilizar para aquellos que gusten vivir &#8220;on the edge&#8221;.</p>
<p>Para aquellos que quieran un rejunte completo de todo lo que se viene pueden ver el post : <a href="http://ryandaigle.com/articles/2008/10/25/what-s-new-in-edge-rails-rails-2-2-released-summary-of-features">What&#8217;s New in Edge Rails: Rails 2.2 Released &#8211; Summary of Feature.</a></p>
<p>Yo acá voy a comentar solo lo que tuve la oportunidad de probar y que me resultó útil.</p>
<h2 class="entry-title">I18n</h2>
<p>La verdad es que es una buena noticia, no para mi porque hago todo para un solo idioma <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> , pero algún día puede resultar útil. Lo único que a mi me deja con sabor a poco es la forma en que se hace que no me termina de gustar. Antes que nada quiero aclarar, porque ya vi la pregunta en un par de listas de correo, que esto localiza textos, no el contenido de una instancia de ActiveRecord. Si uno quiere que el contenido que cargan los usuarios sea traducido, es otra historia <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Las traducciones se escriben en ruby o en archivos YAML, con &#8220;hashes&#8221; que pueden estar anidados (como si fueran &#8220;<em>namespaces</em>&#8220;) :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># lib/locale/en-US.rb</span>
<span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#996600;">'en-US'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#ff3333; font-weight:bold;">:hello_world</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Hello World&quot;</span>,
  <span style="color:#ff3333; font-weight:bold;">:hello_flash</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Hello Flash&quot;</span>
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># lib/locale/pirate.rb</span>
<span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#996600;">'pirate'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#ff3333; font-weight:bold;">:hello_world</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Ahoy World&quot;</span>,
  <span style="color:#ff3333; font-weight:bold;">:hello_flash</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Ahoy Flash&quot;</span>
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Y luego en las vistas (o mailers o donde sea) en lugar de poner el texto se ingresa el symbol asociado al texto que cargamos en las traducciones, por ejemplo :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;</span>h1<span style="color:#006600; font-weight:bold;">&gt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>=t <span style="color:#ff3333; font-weight:bold;">:hello_world</span> <span style="color:#006600; font-weight:bold;">%&gt;&lt;/</span>h1<span style="color:#006600; font-weight:bold;">&gt;</span></pre></div></div>

<p>Mi problema particular con este método es que estoy mucho más acostumbrado a cómo se hace con gettext (que no necesariamente es la mejor forma) donde se ponen todos los textos en inglés en la aplicación y después se escriben las traducciones.</p>
<p>Hay un demo online <a href="http://i18n-demo.phusion.nl/">acá</a>, que en estos momentos está caído, espero que para cuando lean esto ya este funcionando de nuevo.</p>
<h2 class="entry-title">Join Tables Conditions</h2>
<p>Esto es algo que realmente hacía falta. Vamos a ver la mejora con un ejemplo. Supongamos que tenemos los siguientes modelos :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Article <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  belongs_to <span style="color:#ff3333; font-weight:bold;">:user</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_many <span style="color:#ff3333; font-weight:bold;">:articles</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>y queremos obtener todos los usuarios que tengan al menos un artículo publicado. Para eso deberíamos hacer :
</pre>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">User.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span>, <span style="color:#ff3333; font-weight:bold;">:joins</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:article</span>,  <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;articles.published = ?&quot;</span>, <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Con la nueva sintaxis es posible especificar este tipo de queries de una manera más amena como sigue :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">User.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span>, <span style="color:#ff3333; font-weight:bold;">:joins</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:article</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:articles</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:published</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<h2>ActionMailer Layouts</h2>
<p>Algo que si me tocó vivir es tener varios emails HTML con un mismo formato y que cambiaba el contenido (Tu amigo te invitó, Tu nueva clave es, Ganaste un premio, etc). Con el mailer actual casi que hay que hacer un copy &#038; paste del marco y despuer cambiar para cada tipo de email la lógica de qué se muestra.</p>
<p>En rails 2.2 ahora vamos a tener layouts como los tenemos en ActionView, de manera de tenerlo una vez y si arreglamos o cambiamos algo cambia para todos.</p>
<h2>Memoization</h2>
<p>Es muy frecuente que uno agregue lógica simple de caching en los modelos para las variables de instancia como se ve en el siguiente ejemplo :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> full_name
      <span style="color:#0066ff; font-weight:bold;">@full_name</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#996600;">&quot;#{first_name} #{last_name}&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Esto lo hacemos para evitar el overhead de crear el full_name si lo llegamos a usar varias veces en una misma vista, de manera que el string se crea en la primer llamada y en las siguientes solamente lo retorna.</p>
<p>Los puristas dicen que en realidad está mal, porque se está responsabilizando al método de algo que en realidad no debería importarle : la política de caching. ¿Suena exagerado? Seguramente <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Para solucionar esto se agregó el método <code>memoize</code> que nos permite a agregar a un método común este tipo de lógica de manera separada :</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> full_name
      <span style="color:#996600;">&quot;#{first_name} #{last_name}&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    memoize <span style="color:#ff3333; font-weight:bold;">:full_name</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Esto se encarga de que cuando llamemos a <code>@user.full_name</code> se comporte de la misma manera que el primer ejemplo, sin tener que modificar el método. También nos permite saltarnos el "cache", por ejemplo si en la lógica acabamos de cambiar el nombre de pila, debemos forzar para que el nombre completo cambie :</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">   <span style="color:#0066ff; font-weight:bold;">@user</span> = User.<span style="color:#9900CC;">new</span> <span style="color:#ff3333; font-weight:bold;">:first_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Test'</span>, <span style="color:#ff3333; font-weight:bold;">:last_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Test'</span>
   <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">full_name</span> <span style="color:#008000; font-style:italic;"># =&gt; Test Test</span>
   <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">first_name</span> = <span style="color:#996600;">'Do'</span>
   <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">full_name</span> <span style="color:#008000; font-style:italic;"># =&gt; Test Test</span>
   <span style="color:#0066ff; font-weight:bold;">@user</span>.<span style="color:#9900CC;">full_name</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># =&gt; Do Test</span></pre></div></div>

<h2>Y más</h2>
<p>Hay varios cambios más, como Thread Safety, ETag, partial GETs y demás que a mi por ahora no me interesan y por eso no me entiendo mucho más. Pueden consultar el anuncio oficial para ver de que se tratan o cómo pueden hacerle la vida más fácil <img src='http://www.gazer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gazer.com.ar/2008/10/27/lo-que-viene-en-rails-2-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

