<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gabriel Schiavo</title>
    <description>The latest articles on Forem by Gabriel Schiavo (@gbs0).</description>
    <link>https://forem.com/gbs0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F469824%2F95c2f589-56ea-4216-bd09-4b02be36c609.jpeg</url>
      <title>Forem: Gabriel Schiavo</title>
      <link>https://forem.com/gbs0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gbs0"/>
    <language>en</language>
    <item>
      <title>Acelerando o Boot da sua aplicação Rails</title>
      <dc:creator>Gabriel Schiavo</dc:creator>
      <pubDate>Tue, 03 May 2022 21:32:41 +0000</pubDate>
      <link>https://forem.com/gbs0/acelerando-o-boot-da-sua-aplicacao-rails-oec</link>
      <guid>https://forem.com/gbs0/acelerando-o-boot-da-sua-aplicacao-rails-oec</guid>
      <description>&lt;p&gt;Quando falamos de Ruby on Rails, estamos falando do principal framework MVC da linguagem Ruby, que contém todas as partes de uma aplicação completa, tanto na parte do front-end quanto na parte do back-end.&lt;/p&gt;

&lt;p&gt;Conforme vamos adicionando mais extensões, ou dados na nossa aplicação Rails, as coisas começam a ficar um pouco mais “trabalhosas” de serem executadas, e com a gema que iremos ver hoje, podemos facilmente implementar e perceber a diferença no carregamento da aplicação Rails.&lt;/p&gt;

&lt;p&gt;Então, vamos usar uma extensão/gema chamada &lt;a href="https://github.com/Shopify/bootsnap"&gt;Bootsnap&lt;/a&gt;, desenvolvida pelo Shopify. &lt;br&gt;
De acordo com alguns testes, a gema promete tornar a inicialização de qualquer app em Rails ou Ruby, 50% mais rápido, sem comprometer as funcionalidades ou os assets dentro da aplicação Rails.&lt;/p&gt;

&lt;p&gt;O que a gema faz por debaixo dos panos, é utilizar a linguagem C para fazer um patch dos arquivos em Ruby, e com isso, conseguimos diminuir drasticamente o boot da aplicação.&lt;/p&gt;

&lt;p&gt;Portanto, antes de aprofundarmos em como melhorar o desempenho da aplicação, vamos entender por partes, como funciona a inicialização.&lt;/p&gt;

&lt;p&gt;Ao rodarmos &lt;code&gt;rails console&lt;/code&gt; ou &lt;code&gt;rails server&lt;/code&gt; para iniciar a aplicação em Rails, invocamos uma ordem na qual os pacotes, arquivos e as configurações são iniciadas na seguinte ordem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;bin/rails → Gemfile → boot.rb → config/application.rb&lt;br&gt;
→ Mensagem básica do servidor é mostrada na tela &lt;br&gt;
→ config/environments/development.rb&lt;/strong&gt;  &lt;br&gt;
&lt;strong&gt;→  Arquivos que estão na pasta &lt;code&gt;initializer&lt;/code&gt;&lt;/strong&gt; &lt;br&gt;
&lt;strong&gt;→  config/routes.rb&lt;/strong&gt;  &lt;br&gt;
&lt;strong&gt;→  config/environment.rb&lt;/strong&gt;  &lt;br&gt;
→  &lt;strong&gt;config.ru (se houver)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Acima sumarizo o processo dos arquivos de boot de forma bastante resumida, caso queira entender de forma profunda o que contém e como funciona cada arquivo, acesse este link do &lt;a href="https://guides.rubyonrails.org/initialization.html"&gt;Guia Ruby on Rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A principio, quando a execução cai no Gemfile, o Rails carrega todas as extensões contidas dentro desse arquivo, além de suas proprias &lt;em&gt;engines&lt;/em&gt;, que são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Actioncable&lt;/li&gt;
&lt;li&gt;Actionmailer&lt;/li&gt;
&lt;li&gt;Actionpack&lt;/li&gt;
&lt;li&gt;Actionview&lt;/li&gt;
&lt;li&gt;Activejob&lt;/li&gt;
&lt;li&gt;Activemodel&lt;/li&gt;
&lt;li&gt;Activerecord&lt;/li&gt;
&lt;li&gt;Activestorage&lt;/li&gt;
&lt;li&gt;Activesupport&lt;/li&gt;
&lt;li&gt;Actionmailbox&lt;/li&gt;
&lt;li&gt;Actiontext&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para carregar essas e outras extensões, é como se o Rails perguntasse ao computador se aquela extensão que ele está requerindo está disponivel em um diretório especifico, caso não esteja, ele continua percorrendo os diretórios e a execução continua somente quando o diretório em questão é encontrado.&lt;/p&gt;

&lt;p&gt;A grande mudança que a gema Bootsnap encorpora na nossa aplicação Rails, é fazer um cache dentro do diretório &lt;code&gt;tmp/cache/&lt;/code&gt; da aplicação, com um arquivo contendo todos os caminhos pré estabelecidos, assim, quando inicializamos nossa aplicação, fica muito menos trabalhosa essa etapa de requerir todos os arquivos de uma só vez.&lt;/p&gt;

&lt;p&gt;Para utilizarmos essa gema, primeiro precisamos declará-la no &lt;code&gt;Gemfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Gemfile&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'bootsnap'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodar o &lt;code&gt;bundle install&lt;/code&gt;, precisamos requerir esta gema no arquivo &lt;code&gt;config/boot.rb&lt;/code&gt; imediatamente depois do &lt;code&gt;require 'bundler/setup'&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ./config/boot.rb&lt;/span&gt;

&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'BUNDLE_GEMFILE'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../Gemfile'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__dir__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'bundle/setup'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'bootsnap/setup'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E pronto! Agora a aplicação está pronta para ser iniciada novamente.&lt;/p&gt;

&lt;p&gt;Para efeitos de comparação, utilizarei neste exemplo uma aplicação Rails já criada em meu ambiente local, assim posso ilustrar a diferença real entre a aplicação com o boot “padrão” e depois, com a gema Bootsnap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando as diferenças
&lt;/h2&gt;

&lt;p&gt;Vamos aos testes, pra isso, primeiramente, vou criar um arquivo do tipo Shell Script (&lt;code&gt;.sh&lt;/code&gt;), assim posso invocar a chamada de um &lt;code&gt;rails runner&lt;/code&gt; utilizando o comando &lt;code&gt;time&lt;/code&gt; do terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
rails runner &lt;span class="s2"&gt;"puts Tillage.count"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basicamente, este script irá contar a quantidade de registros provenientes do modelo &lt;code&gt;Tillage&lt;/code&gt; da minha aplicação, então rodaremos esse script primeiro &lt;strong&gt;sem o Bootsnap:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  solocamp-tech git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;time&lt;/span&gt; ./test/script.sh
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 15855
1028
./test/script.sh  1.05s user 0.69s system 31% cpu 5.482 total
➜  solocamp-tech git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;time&lt;/span&gt; ./test/script.sh
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 16135
1028
./test/script.sh  0.70s user 0.48s system 79% cpu 1.483 total
➜  solocamp-tech git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;time&lt;/span&gt; ./test/script.sh
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 16416
1028
./test/script.sh  0.70s user 0.53s system 75% cpu 1.615 total
➜  solocamp-tech git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;time&lt;/span&gt; ./test/script.sh
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 16695
1028
./test/script.sh  0.77s user 0.52s system 82% cpu 1.562 total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos notar que a execução demorou em média &lt;strong&gt;1,5s&lt;/strong&gt; para ser executado (ignorando a primeira execução). &lt;/p&gt;

&lt;p&gt;Agora vamos ao teste &lt;strong&gt;com o Bootsnap&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  solocamp-tech git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;time&lt;/span&gt; ./test/script.sh
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 8567
28
./test/script.sh  0.66s user 0.44s system 81% cpu 1.360 total
➜  solocamp-tech git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;time&lt;/span&gt; ./test/script.sh
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 8847
28
./test/script.sh  0.66s user 0.44s system 80% cpu 1.372 total
➜  solocamp-tech git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;time&lt;/span&gt; ./test/script.sh
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 9128
28
./test/script.sh  0.67s user 0.47s system 80% cpu 1.408 total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que o tempo de execução foi reduzido, neste caso da amostra, a diferença não é muito grande, porém conseguimos manter uma media de &lt;strong&gt;1,3s&lt;/strong&gt; para cada execução.&lt;br&gt;
Caso o script fosse maior, isso é, se incluisse mais  contagens de outros modelos, essa diferença seria bem maior! &lt;/p&gt;

&lt;p&gt;Então podemos notar que quanto maior a aplicação Rails, maior a diferença entre os tempos de boot utilizando &lt;strong&gt;Bootsnap!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>tutorial</category>
      <category>performance</category>
    </item>
    <item>
      <title>Utilizando Scopes em Ruby on Rails</title>
      <dc:creator>Gabriel Schiavo</dc:creator>
      <pubDate>Fri, 29 Apr 2022 13:31:07 +0000</pubDate>
      <link>https://forem.com/gbs0/utilizando-scopes-em-ruby-on-rails-26ef</link>
      <guid>https://forem.com/gbs0/utilizando-scopes-em-ruby-on-rails-26ef</guid>
      <description>&lt;p&gt;ActiveRecord é uma das engines dentro do core Rails, que trás consigo a implementação de um &lt;strong&gt;ORM&lt;/strong&gt; (Object Relational Mapping), que é um conceito dentro da arquitetura de software na qual utilizamos técnicas de programação para converter/lidar com dados entre o banco de dados e a programação orientada a objetos, nesse caso, utilizando Ruby.&lt;/p&gt;

&lt;p&gt;Ruby on Rails é um poderoso framework MVC que trás consigo várias soluções flexiveis e inteligentes para problemas já conhecidos dentro do desenvolvimento back-end.&lt;br&gt;
Podemos citar algumas soluções que vem trazendo bastante poder aos desenvolvedores, porém hoje, trago uma funcionalidade que podemos utilizar nativamente em Rails, visto que vamos utilizar a &lt;code&gt;RailsEngine::ActiveRecord&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O funcionamento por “baixo dos panos” é poder fazer &lt;em&gt;queries&lt;/em&gt; em SQL puro, porém utilizando os conceitos e métodos através de uma linguagem padrão.&lt;/p&gt;
&lt;h2&gt;
  
  
  Scopes em Ruby on Rails
&lt;/h2&gt;

&lt;p&gt;• O que são scopes?&lt;/p&gt;

&lt;p&gt;Geralmente utilizamos scopes para construir &lt;em&gt;queries&lt;/em&gt; personalizadas dentro das entidades modelo da aplicação, e além disso, podemos utilizar o scope criado como um &lt;strong&gt;método de classe.&lt;/strong&gt; Assim, fazemos uso desses scopes como qualquer outro método presente no &lt;strong&gt;ActiveRecord.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Sintaxe e parâmetros
&lt;/h2&gt;

&lt;p&gt;Todo scope precisa receber dois argumentos, são eles:&lt;/p&gt;

&lt;p&gt;• 1. Um nome, que será usado para chamar este scope no código.&lt;/p&gt;

&lt;p&gt;• 2. Uma &lt;strong&gt;lambda,&lt;/strong&gt; que implementa a query.&lt;/p&gt;

&lt;p&gt;A sintaxe de um scope é definido por:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scope :name_of_your_scope, -&amp;gt; { where(“column_name = ?”, value)}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Também podemos passar diferentes &lt;strong&gt;parâmetros&lt;/strong&gt; para utilizarmos ao fazer as nossas buscas. Para elucidar o conceito, suponhamos que seja necessário buscar em uma base de dados, os usuários que foram criados nos ultimos 30 dias.&lt;/p&gt;

&lt;p&gt;Podemos declarar o scope para receber o parametro &lt;strong&gt;date&lt;/strong&gt; da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="ss"&gt;:get_users_by_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"created_at &amp;gt; ?"&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;days&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ago&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nil?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso não seja passado nenhuma data, colocamos por padrão 30 dias a partir do dia de hoje.&lt;/p&gt;

&lt;p&gt;Como resultado da chamada deste scope, recebemos um objeto do tipo &lt;code&gt;ActiveRecord::Relation&lt;/code&gt;. Isso significa que podemos encadear e combinar diferentes scopes. Também, em termos de funcionalidade, o scope garante que erros sejam evitados caso o retorno da nossa query venha &lt;strong&gt;vazio.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scopes com SQL puro
&lt;/h2&gt;

&lt;p&gt;Outro jeito válido de declararmos scopes, é utilizando queries com SQL puro, assim conseguimos passar um ou mais parâmetros no scope e utilizá-los dentro da query, e claro, evitando injeção de outros parâmetros desnecessários na busca.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="ss"&gt;:find_by_range_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="no"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="sc"&gt;?“&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Scope vs Default Scope
&lt;/h2&gt;

&lt;p&gt;Quando declaramos um &lt;code&gt;default_scope&lt;/code&gt;, garantimos que &lt;strong&gt;por padrão,&lt;/strong&gt; essa query será aplicada &lt;strong&gt;automaticamente&lt;/strong&gt; em nosso modelo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
 &lt;span class="n"&gt;default_scope&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;admin: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comportamento redefine por padrão o método &lt;code&gt;.all&lt;/code&gt; do nosso modelo, portando devemos evitar seu uso, visto que alguns erros e tempo de depuração não sejam perdidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Um dos grandes potenciais do Rails é poder combinar ou encadear outros &lt;em&gt;scopes&lt;/em&gt; diferentes, assim podemos criar queries mais fáceis de ler, ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
  &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort_by_creation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;some_other_scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;role: &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, ao utilizarmos outros scopes e até os métodos padrões do ActiveRecord, podemos separar de forma mais limpa e clara, as responsabilidades e funcionalidades de cada &lt;em&gt;query&lt;/em&gt; presente **nos modelos.&lt;/p&gt;

&lt;p&gt;Outro ponto que não abordei ao longo deste guia, foi o uso de &lt;strong&gt;Lambdas&lt;/strong&gt; para escrevermos os scopes utilizando apenas uma linha. Isso acontece pois a lambda é um objeto do tipo &lt;strong&gt;Proc.&lt;/strong&gt; Basicamente, um proc, é um objeto que encapsula um &lt;strong&gt;bloco de código&lt;/strong&gt;, exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lambda = -&amp;gt;(x) { x**2 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lambda = Proc.new {|x| x**2 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ao fazer &lt;code&gt;lambda.(3)&lt;/code&gt; ou &lt;code&gt;lambda.call(3)&lt;/code&gt; em ambas as variavéis, vamos receber o resultado 9. Mas isso deixo pra abordar em meu proximo aprendizado, até mais, nos vemos lá!&lt;/p&gt;

</description>
      <category>rails</category>
      <category>activerecord</category>
      <category>ruby</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
