<?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>DEV Community: Agustin Martinez</title>
    <description>The latest articles on DEV Community by Agustin Martinez (@agustincchato).</description>
    <link>https://dev.to/agustincchato</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%2F197520%2Fb5546f41-dd28-4ae7-98d2-9319f95e6a92.jpg</url>
      <title>DEV Community: Agustin Martinez</title>
      <link>https://dev.to/agustincchato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agustincchato"/>
    <language>en</language>
    <item>
      <title>How do I attach my rails custom generator to the model one?</title>
      <dc:creator>Agustin Martinez</dc:creator>
      <pubDate>Wed, 30 Sep 2020 15:13:51 +0000</pubDate>
      <link>https://dev.to/agustincchato/how-do-i-attach-my-rails-custom-generator-to-the-model-one-3b0j</link>
      <guid>https://dev.to/agustincchato/how-do-i-attach-my-rails-custom-generator-to-the-model-one-3b0j</guid>
      <description>&lt;p&gt;Currently, I created an independent generator. When I run &lt;code&gt;rails g query&lt;/code&gt;, it works and creates my files well. &lt;/p&gt;

&lt;p&gt;Here that code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/generators/rails/query_generator.rb&lt;/span&gt;

&lt;span class="nb"&gt;require_relative&lt;/span&gt; &lt;span class="s1"&gt;'../my_gem/named_base'&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Rails&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Generators&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QueryGenerator&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;MyLib&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Generators&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;NamedBase&lt;/span&gt;
      &lt;span class="n"&gt;source_root&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_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'templates'&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="n"&gt;check_class_collision&lt;/span&gt; &lt;span class="ss"&gt;suffix: &lt;/span&gt;&lt;span class="s1"&gt;'Query'&lt;/span&gt;

      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_model_query&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;class_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;

        &lt;span class="n"&gt;template_file&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;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'app/queries'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_query.rb"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="s1"&gt;'query.rb.erb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;template_file&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, I want to run the generator when the people run &lt;code&gt;rails g model&lt;/code&gt; but I can't achieve it.&lt;br&gt;
I try to override the generator model class and use a &lt;code&gt;hook_for&lt;/code&gt; to call it but it isn't working. Here the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/generators/model_generator.rb&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"rails/generators"&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"rails/generators/rails/model/model_generator"&lt;/span&gt;
&lt;span class="nb"&gt;require_relative&lt;/span&gt; &lt;span class="s1"&gt;'./query_generator'&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Rails&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Generators&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelGenerator&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Generators&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ModelGenerator&lt;/span&gt;
      &lt;span class="n"&gt;hook_for&lt;/span&gt; &lt;span class="ss"&gt;:orm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: :model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;in: :rails&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Generators&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;QueryGenerator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I hope you can help me. Thanks!&lt;/p&gt;

&lt;h2&gt;
  
  
  Update
&lt;/h2&gt;

&lt;p&gt;Finally, I found the solution! With the help of &lt;a href="https://api.rubyonrails.org/classes/Rails/Railtie.html"&gt;Railtie&lt;/a&gt;, I could achieve the expected behaviour hooking from the rails model generator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/my_gem.rb&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'my_gem/railtie'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;defined?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# lib/my_gem/railtie.rb&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rails/railtie'&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ActiveModel&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Railtie&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Railtie&lt;/span&gt;
    &lt;span class="n"&gt;generators&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Generators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure!&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generators&lt;/span&gt;
      &lt;span class="nb"&gt;require_relative&lt;/span&gt; &lt;span class="s1"&gt;'../generators/model_generator'&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# lib/generators/model_generator.rb&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rails/generators'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rails/generators/rails/model/model_generator'&lt;/span&gt;
&lt;span class="nb"&gt;require_relative&lt;/span&gt; &lt;span class="s1"&gt;'rails/query_generator'&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Rails&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Generators&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelGenerator&lt;/span&gt;
      &lt;span class="n"&gt;hook_for&lt;/span&gt; &lt;span class="ss"&gt;:query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: :boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;default: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>help</category>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Rails N+1 query and Draper decorators</title>
      <dc:creator>Agustin Martinez</dc:creator>
      <pubDate>Sat, 22 Feb 2020 16:59:11 +0000</pubDate>
      <link>https://dev.to/agustincchato/rails-n-1-query-and-decorators-16mb</link>
      <guid>https://dev.to/agustincchato/rails-n-1-query-and-decorators-16mb</guid>
      <description>&lt;p&gt;In this article, I am going to tell you about how decorators cause a N+1 query and how I solve it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scenario
&lt;/h2&gt;

&lt;p&gt;I developed an API to support a web site that allows their user sends messages to other users typing their emails. This case is about the endpoint which lists all the messages of the logged user.&lt;/p&gt;

&lt;p&gt;I had three models: Message, Recipient, and User. A &lt;strong&gt;Message&lt;/strong&gt; has many &lt;strong&gt;Recipients&lt;/strong&gt; and these recipients have a &lt;strong&gt;User&lt;/strong&gt; that could exist or not because the user could be registered on the web site or not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/models/message.rb&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Message&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;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:recipients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;dependent: :destroy&lt;/span&gt;

  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# app/models/recipient.rb&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Recipient&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;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;optional: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;uniqueness: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;scope: :message_id&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# app/models/user.rb&lt;/span&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;has_many&lt;/span&gt; &lt;span class="ss"&gt;:messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;dependent: :destroy&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:recipients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;inverse_of: :user&lt;/span&gt;

  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Also, I have an endpoint that returns all the messages to the current user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/controllers/api/v1/messages_controller.rb&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Api&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;V1&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MessageController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
      &lt;span class="n"&gt;before_action&lt;/span&gt; &lt;span class="ss"&gt;:authenticate_user!&lt;/span&gt;

      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
        &lt;span class="vi"&gt;@messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;recipients: :user&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;created_at: :desc&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decorate&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;At this point, I just did the recommended code to avoid N+1 queries. Finally, I render the view using &lt;a href="https://github.com/rails/jbuilder"&gt;jbuilder&lt;/a&gt; to return the object as a JSON. The decorators are implemented with the gem &lt;a href="https://github.com/drapergem/draper"&gt;draper&lt;/a&gt; to allow some presentation values keeping clean models.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/views/api/v1/messages/index.json.jbuilder&lt;/span&gt;

&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;messages&lt;/span&gt; &lt;span class="vi"&gt;@messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;partial: &lt;/span&gt;&lt;span class="s1"&gt;'info'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: :message&lt;/span&gt;

&lt;span class="c1"&gt;# app/views/api/v1/messages/_info.json.jbuilder&lt;/span&gt;

&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract!&lt;/span&gt;     &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:created_at&lt;/span&gt;
&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recipients&lt;/span&gt;   &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decorate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;partial: &lt;/span&gt;&lt;span class="s1"&gt;'api/v1/recipients/info'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: :recipient&lt;/span&gt;

&lt;span class="c1"&gt;# app/views/api/v1/recipients/_info.json.jbuilder&lt;/span&gt;

&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract!&lt;/span&gt;   &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:user_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/decorators/recipients_decorator.rb&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RecipientDecorator&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Draper&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Decorator&lt;/span&gt;
  &lt;span class="n"&gt;delegate_all&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;user_name&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt;

    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;My surprise was when I run the code and got that output in the console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Started GET &lt;span class="s2"&gt;"/api/v1/messages"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; ::1 at 2020-02-22 13:08:16 &lt;span class="nt"&gt;-0300&lt;/span&gt;
Processing by Api::V1::MessagesController#index as JSON
  Parameters: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"uid"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"uid"&lt;/span&gt;, &lt;span class="s2"&gt;"user@mail.com"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendering api/v1/messages/index.json.jbuilder
  Message Load &lt;span class="o"&gt;(&lt;/span&gt;4.5ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT DISTINCT &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"messages"&lt;/span&gt; INNER JOIN &lt;span class="s2"&gt;"recipients"&lt;/span&gt; ON &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"user_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; AND &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; NOT IN &lt;span class="o"&gt;(&lt;/span&gt;SELECT DISTINCT &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; FROM &lt;span class="s2"&gt;"messages"&lt;/span&gt; INNER JOIN &lt;span class="s2"&gt;"recipients"&lt;/span&gt; ON &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"user_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; AND &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"state"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; AND &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"state"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$4&lt;/span&gt; AND &lt;span class="o"&gt;(&lt;/span&gt;opening_date &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2020-01-23 00:00:00'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; ORDER BY &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"created_at"&lt;/span&gt; DESC LIMIT &lt;span class="nv"&gt;$5&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"user_id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"user_id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"state"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"state"&lt;/span&gt;, 0], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 2]]
  Recipient Load &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"recipients"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; IN &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;, &lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"message_id"&lt;/span&gt;, 49], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"message_id"&lt;/span&gt;, 45]]
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; IN &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;, &lt;span class="nv"&gt;$2&lt;/span&gt;, &lt;span class="nv"&gt;$3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 6], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 2], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 1]]
  Recipient Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"recipients"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"message_id"&lt;/span&gt;, 49]]
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 6], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 1.8ms | Allocations: 730&lt;span class="o"&gt;)&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.2ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 2], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 1.3ms | Allocations: 727&lt;span class="o"&gt;)&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 1.3ms | Allocations: 726&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/messages/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 7.1ms | Allocations: 3130&lt;span class="o"&gt;)&lt;/span&gt;
  Recipient Load &lt;span class="o"&gt;(&lt;/span&gt;0.2ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"recipients"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"message_id"&lt;/span&gt;, 45]]
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.2ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 6], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 1.3ms | Allocations: 726&lt;span class="o"&gt;)&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 2], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 1.3ms | Allocations: 727&lt;span class="o"&gt;)&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 1.7ms | Allocations: 726&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/messages/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 6.4ms | Allocations: 3123&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/messages/index.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 24.4ms | Allocations: 9626&lt;span class="o"&gt;)&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;1.1ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
Completed 200 OK &lt;span class="k"&gt;in &lt;/span&gt;33ms &lt;span class="o"&gt;(&lt;/span&gt;Views: 17.9ms | ActiveRecord: 8.7ms | Allocations: 12313&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you see, the first query is right, it calls all the necessary data in a single query. But then, when starts to render the partial views, it queries again by recipients and users 🤯.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the trouble
&lt;/h2&gt;

&lt;p&gt;After many hours of surfing by different web sites and apply many workarounds. Just try deleting the &lt;code&gt;decorate&lt;/code&gt; statement from &lt;code&gt;message.recipients.decorate&lt;/code&gt; at &lt;code&gt;app/views/api/v1/messages/_info.json.jbuilder&lt;/code&gt;... Suddenly, the rendering works as it suppose to work, making only the first query. But, I also have the issue that I need the decorator to render the &lt;code&gt;user_name&lt;/code&gt; at &lt;code&gt;app/views/api/v1/recipients/_info.json.jbuilder&lt;/code&gt; view.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;So, I have to call the decorator at Messages view to be able to use the &lt;code&gt;user_name&lt;/code&gt; decorate inner the Recipients view. According to the &lt;a href="https://github.com/drapergem/draper"&gt;draper&lt;/a&gt; documentation the &lt;code&gt;&amp;lt;collection&amp;gt;.decorate&lt;/code&gt; apply to collections which are an ActiveRecord query, that means that it raises a query to the database ignoring the preload data. Also, there is a way to decorate any collection &lt;code&gt;&amp;lt;Decorator class&amp;gt;.decorate_collection(&amp;lt;collection&amp;gt;)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finally, I refactor the code to use this new method. The result was the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/views/api/v1/messages/_info.json.jbuilder&lt;/span&gt;

&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract!&lt;/span&gt;     &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:created_at&lt;/span&gt;
&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recipients&lt;/span&gt;   &lt;span class="no"&gt;RecipientDecorator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decorate_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                  &lt;span class="ss"&gt;partial: &lt;/span&gt;&lt;span class="s1"&gt;'api/v1/recipients/info'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="ss"&gt;as: :recipient&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And now, when I call the endpoint the log was these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Started GET &lt;span class="s2"&gt;"/api/v1/messages"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; ::1 at 2020-02-22 13:37:04 &lt;span class="nt"&gt;-0300&lt;/span&gt;
Processing by Api::V1::MessagesController#index as JSON
  Parameters: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.8ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"uid"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"uid"&lt;/span&gt;, &lt;span class="s2"&gt;"user@mail.com"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  Rendering api/v1/messages/index.json.jbuilder
  Message Load &lt;span class="o"&gt;(&lt;/span&gt;2.0ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT DISTINCT &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"messages"&lt;/span&gt; INNER JOIN &lt;span class="s2"&gt;"recipients"&lt;/span&gt; ON &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"user_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; AND &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; NOT IN &lt;span class="o"&gt;(&lt;/span&gt;SELECT DISTINCT &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; FROM &lt;span class="s2"&gt;"messages"&lt;/span&gt; INNER JOIN &lt;span class="s2"&gt;"recipients"&lt;/span&gt; ON &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"user_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; AND &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"state"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; AND &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"state"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$4&lt;/span&gt; AND &lt;span class="o"&gt;(&lt;/span&gt;opening_date &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2020-01-23 00:00:00'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; ORDER BY &lt;span class="s2"&gt;"messages"&lt;/span&gt;.&lt;span class="s2"&gt;"created_at"&lt;/span&gt; DESC LIMIT &lt;span class="nv"&gt;$5&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"user_id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"user_id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"state"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"state"&lt;/span&gt;, 0], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 2]]
  Recipient Load &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"recipients"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"recipients"&lt;/span&gt;.&lt;span class="s2"&gt;"message_id"&lt;/span&gt; IN &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;, &lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"message_id"&lt;/span&gt;, 49], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"message_id"&lt;/span&gt;, 45]]
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; IN &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;, &lt;span class="nv"&gt;$2&lt;/span&gt;, &lt;span class="nv"&gt;$3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 6], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 2], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 1]]
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 0.4ms | Allocations: 379&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 0.3ms | Allocations: 340&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 0.4ms | Allocations: 339&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/messages/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 3.2ms | Allocations: 1753&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 0.5ms | Allocations: 337&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 0.7ms | Allocations: 338&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/recipients/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 0.4ms | Allocations: 337&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/messages/_info.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 2.8ms | Allocations: 1597&lt;span class="o"&gt;)&lt;/span&gt;
  Rendered api/v1/messages/index.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;Duration: 26.6ms | Allocations: 16194&lt;span class="o"&gt;)&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; LIMIT &lt;span class="nv"&gt;$2&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;, 1], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
Completed 200 OK &lt;span class="k"&gt;in &lt;/span&gt;129ms &lt;span class="o"&gt;(&lt;/span&gt;Views: 23.4ms | ActiveRecord: 21.5ms | Allocations: 35428&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The moral of the story is: If you need to decorate a has many collection inner a view, choose &lt;code&gt;&amp;lt;Decorator class&amp;gt;.decorate_collection(&amp;lt;collection&amp;gt;)&lt;/code&gt; instead of &lt;code&gt;&amp;lt;collection&amp;gt;.decorate&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>decorator</category>
      <category>activerecord</category>
      <category>jbuilder</category>
    </item>
  </channel>
</rss>
