<?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>Direto e Fácil &#187; rails</title>
	<atom:link href="http://www.diretoefacil.com.br/tag/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diretoefacil.com.br</link>
	<description>Não tem que ser difícil.</description>
	<lastBuildDate>Tue, 20 Dec 2011 15:54:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Removendo referências em cascata no Rails</title>
		<link>http://www.diretoefacil.com.br/2011/02/04/removendo-referencias-em-cascata-no-rails/</link>
		<comments>http://www.diretoefacil.com.br/2011/02/04/removendo-referencias-em-cascata-no-rails/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 23:48:22 +0000</pubDate>
		<dc:creator>Bruno Milare</dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[Cascata]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.diretoefacil.com.br/?p=204</guid>
		<description><![CDATA[O problema: Recentement me deparei com um problema que pode ser considerado bem sutil. Eu tinha três tabelas e cada uma tinha relacionamento 1 para n com outra, algo parecido com o MER abaixo. Eu estava tratando a remoção em (&#8230;)</p><p><a href="http://www.diretoefacil.com.br/2011/02/04/removendo-referencias-em-cascata-no-rails/">Read the rest of this entry &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<h1>O problema:</h1>
<p>Recentement me deparei com um problema que pode ser considerado bem sutil.<br />
Eu tinha três tabelas e cada uma tinha relacionamento 1 para n com outra, algo parecido com o MER abaixo.</p>
<div class="wp-caption aligncenter" style="width: 468px"><img alt="MER" src="http://img138.imageshack.us/img138/3425/relacionamentodestroyde.png" title="MER" width="458" height="108" /><p class="wp-caption-text">Relacionamentos</p></div>
<p>Eu estava tratando a remoção em cascata das dependências utilizando :delete_all, e quando removia a tabela principal, somente o primeiro nível de referência era removido, deixando a última tabela intacta, fui atrás de saber o porque disso.</p>
<p>Descobri que o <em>:delete_all</em> age direto na tabela, portanto, assim que um registro é destruído suas dependências são destruídas direto no banco e a aplicação Rails nem se dá conta de que algo foi removido, então, quando a tabela intermediária é removida, a aplicação não sabe que tem que remover a próxima dependência e então pára por aí.</p>
<p>Para resolver isso utilizei o <em>:destroy</em> para remoção em cascata, esse método instancia o objeto a ser removido e então os callbacks são chamados, assim a aplicação é notificada da remoção e chama a próxima remoção de dependências, obviamente esse método é mais lento, vamos verificar isso na parte de performance.<br />
<span id="more-204"></span></p>
<h1>Na prática:</h1>
<p>Para ilustrar o problema e fazer algumas comparações, criei o cenário ilustrado no MER acima. Criando 10 produtos, para cada produto 10 categorias e para cada categoria 10 tags. Tendo portanto:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Produtos: <span style="color: #000000;">10</span><br />
Categorias: <span style="color: #000000;">10</span> x <span style="color: #000000;">10</span> = <span style="color: #000000;">100</span><br />
Tags: <span style="color: #000000;">10</span> x <span style="color: #000000;">10</span> x <span style="color: #000000;">10</span> = <span style="color: #000000;">1000</span></div></div>
<h2>:delete_all</h2>
<p>Seguem os modelos:</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> Product <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span><br />
&nbsp; has_many <span style="color:#ff3333; font-weight:bold;">:categories</span>, <span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:delete_all</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">class</span> Category <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span><br />
&nbsp; belongs_to <span style="color:#ff3333; font-weight:bold;">:product</span><br />
&nbsp; has_many <span style="color:#ff3333; font-weight:bold;">:tags</span>, <span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:delete_all</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">class</span> Tag <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span><br />
&nbsp; belongs_to <span style="color:#ff3333; font-weight:bold;">:category</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Temos assim o seguinte resultado:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;=<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;products: 10, categories: 100, tags: 1000&quot;</span> <br />
ruby-1.9.2-rc1 <span style="color: #000000; font-weight: bold;">&gt;</span> Product.all.each<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000; font-weight: bold;">|</span>p<span style="color: #000000; font-weight: bold;">|</span> p.destroy<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
&nbsp;=<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;products: 0, categories: 0, tags: 1000&quot;</span></div></div>
<p>Vemos que as tags permaneceram intactas.</p>
<h2>:destroy</h2>
<p>Nesse caso podemos alterar somente o modelo do Produto, não há necessidade de alterar a Categoria visto que as Tags são o nosso último nível e não precisamos tratar suas dependências.</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> Product <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span><br />
&nbsp; has_many <span style="color:#ff3333; font-weight:bold;">:categories</span>, <span style="color:#ff3333; font-weight:bold;">:dependent</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:destroy</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>E o resultado:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;=<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;products: 10, categories: 100, tags: 1000&quot;</span> <br />
ruby-1.9.2-rc1 <span style="color: #000000; font-weight: bold;">&gt;</span> Product.all.each<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000; font-weight: bold;">|</span>p<span style="color: #000000; font-weight: bold;">|</span> p.destroy<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
&nbsp;=<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;products: 0, categories: 0, tags: 0&quot;</span></div></div>
<h2>Perfomance</h2>
<p>Para cada produto, de 100, vamos aumentar o número de categorias para 1000 registros por produto e sem nenhuma registro de tag, pois assim podemos validar a performance, pois serão apresentados os mesmo resultados.</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Produtos <span style="color: #000000;">100</span><br />
Categorias <span style="color: #000000;">1000</span> x <span style="color: #000000;">100</span> = <span style="color: #000000;">100000</span></div></div>
<p>Com :delete_all:</p>
<pre>4 seconds</pre>
<p>Com :destroy:</p>
<pre>118 seconds</pre>
<p>Só pra ter um ideia, rs =)</p>
<p>Abraços,</p>
<p>Bruno.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diretoefacil.com.br/2011/02/04/removendo-referencias-em-cascata-no-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Exibindo consultas do banco no console do Rails</title>
		<link>http://www.diretoefacil.com.br/2011/02/03/exibindo-consultas-do-banco-no-console-do-rails/</link>
		<comments>http://www.diretoefacil.com.br/2011/02/03/exibindo-consultas-do-banco-no-console-do-rails/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 23:46:23 +0000</pubDate>
		<dc:creator>Bruno Milare</dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[Active Record]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[Query]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.diretoefacil.com.br/?p=187</guid>
		<description><![CDATA[Muitas vezes você tem a necessidade de verificar as queries que o Active Record está realizando no banco, então, para facilitar a vida existe um maneira de exibir todas as queries no console, enquanto você realiza os comandos. Existem duas (&#8230;)</p><p><a href="http://www.diretoefacil.com.br/2011/02/03/exibindo-consultas-do-banco-no-console-do-rails/">Read the rest of this entry &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes você tem a necessidade de verificar as queries que o Active Record está realizando no banco, então, para facilitar a vida existe um maneira de exibir todas as queries no console, enquanto você realiza os comandos.</p>
<p>Existem duas maneiras de fazer a mesma coisa:</p>
<h1>Pelo irbrc:</h1>
<p>Nesse caso vamos alterar o arquivo <em>˜/.irbrc</em> e adicionar as seguintes linhas:</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">IRB.<span style="color:#9900CC;">conf</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:IRB_RC</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; logger = <span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>STDOUT<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">logger</span> = logger<br />
&nbsp; <span style="color:#6666ff; font-weight:bold;">ActiveResource::Base</span>.<span style="color:#9900CC;">logger</span> = logger<br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Pronto, você visualizará as queries no momento de execução:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ruby-1.9.2-rc1 <span style="color: #000000; font-weight: bold;">&gt;</span> Product.first<br />
Product Load <span style="color: #7a0874; font-weight: bold;">&#40;</span>0.3ms<span style="color: #7a0874; font-weight: bold;">&#41;</span>  SELECT <span style="color: #000000; font-weight: bold;">`</span>products<span style="color: #000000; font-weight: bold;">`</span>.<span style="color: #000000; font-weight: bold;">*</span> FROM <span style="color: #000000; font-weight: bold;">`</span>products<span style="color: #000000; font-weight: bold;">`</span> LIMIT <span style="color: #000000;">1</span></div></div>
<h1>Pela aplicação Rails:</h1>
<p>Adicione ao arquivo <em>config/environment.rb</em> o seguinte trecho de código:</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> log_to<span style="color:#006600; font-weight:bold;">&#40;</span>stream<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">logger</span> = <span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>stream<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">clear_active_connections</span>!<br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Feito isso, quando for utilizar o console, basta redirecionar a saída do log para a saída padrão (STDOUT)</p>
<div class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> log_to STDOUT</div></div>
<p>Vocês podem verificar que desta maneira é possível redirecionar o log para onde você quiser, como o exemplo abaixo:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ruby-1.9.2-rc1 <span style="color: #000000; font-weight: bold;">&gt;</span> buffer = StringIO.new<br />
=<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #666666; font-style: italic;">#&lt;StringIO:0x00000104896908&gt;</span><br />
ruby-1.9.2-rc1 <span style="color: #000000; font-weight: bold;">&gt;</span> log_to buffer<br />
ruby-1.9.2-rc1 <span style="color: #000000; font-weight: bold;">&gt;</span> Product.first<br />
ruby-1.9.2-rc1 <span style="color: #000000; font-weight: bold;">&gt;</span> buffer.string<br />
=<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;  \e[1m\e[35mProduct Load (0.2ms)\e[0m  SELECT <span style="color: #780078;">`products`</span>.* FROM <span style="color: #780078;">`products`</span> LIMIT 1<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span></div></div>
<p>Acho que é isso,<br />
fica aí a dica.<br />
[]&#8216;s<br />
Bruno.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diretoefacil.com.br/2011/02/03/exibindo-consultas-do-banco-no-console-do-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Search + params + will_paginate</title>
		<link>http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/</link>
		<comments>http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 18:12:12 +0000</pubDate>
		<dc:creator>Márcio Gasparotto</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[will_paginate]]></category>

		<guid isPermaLink="false">http://www.diretoefacil.com.br/?p=18</guid>
		<description><![CDATA[Depois que iniciei meu curso de ruby on rails na e-genial ministrado pelo Carlos Brando, tenho me dedicado ainda mais em conhecer e me aprofundar em rails, começar a fazer projetos realmente legais com a ferramenta e deixar de ser (&#8230;)</p><p><a href="http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/">Read the rest of this entry &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Depois que iniciei meu curso de ruby on rails na e-genial ministrado pelo <a href="http://www.nomedojogo.com/" target="_blank">Carlos Brando</a>, tenho me dedicado ainda mais em conhecer e me aprofundar em rails, começar a fazer projetos realmente legais com a ferramenta e deixar de ser apenas mais um eterno iniciante ou um programador mediocre&#8230;.</p>
<p>Esses dias estava trabalhando em um projeto pessoal, em rails é claro&#8230;rs, e precisei implantar uma busca no meu sistema, algo trivial, mas ai fui incrementar, paginar os resultados no estilo dig, etc&#8230; Nesse ponto tive alguns problemas com as rotas e na passagem de parâmetros, ai resolvi fazer esse mini tutorial de como resolvi o problema.</p>
<p>Se alguem conhecer uma solução melhor comenta ai.</p>
<p>Bem, vamos lá&#8230; Para paginar registros eu já estava usando o <a title="Will Paginate" href="http://github.com/mislav/will_paginate/tree/master" target="_blank">will_paginate</a>, e minha solução ficou da seguinte maneira:</p>
<p>No meu controller (categorias_controller.rb) eu adicionei o seguinte metodo:</p>
<p><script src="http://gist.github.com/19916.js"></script></p>
<p>Como estava implantando o formulário de busca em uma tela já pronta e iria repetir esse form em vários lugares, criei um partial para o formulário da busca (_busca.html.erb).</p>
<p><script src="http://gist.github.com/19917.js"></script></p>
<p>A view (busca.html.erb) que apresenta os resultados ficou da seguinte maneira:</p>
<p><script src="http://gist.github.com/19919.js"></script></p>
<p>Observem a linha 26, quando chamo o will_paginate preciso passar como parâmetro a variável query que contem a expressão que esta sendo buscada:</p>
<p><script src="http://gist.github.com/19922.js"></script></p>
<p>No meu arquivo routes.rb eu adicionei uma collection no resouce categorias.</p>
<p><script src="http://gist.github.com/19923.js"></script></p>
<p>Veja que adicionei a :busca como sendo mais um resource de :categorias, o parametro :any significa que esse resource responderá  :get/:post/:put/:delete, eu poderia simplesmente colocar :get, uma vez que o parâmetro nesse caso só é passado via url, mas deixei como :any pra exemplificar.</p>
<p>Ou coisa, pra não precisar ficar definindo os labels do will_paginate em todo os lugares, acrescentei no final(depois do ultimo end) do meu arquivo environment.rb as seguintes linhas:</p>
<p><script src="http://gist.github.com/19924.js"></script></p>
<p>Ai foi só reiniciar o server e partir pro abraço!</p>
<p>Abraço a todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.640 seconds -->

