<?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: Ronak</title>
    <description>The latest articles on DEV Community by Ronak (@ronakjain90).</description>
    <link>https://dev.to/ronakjain90</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%2F477978%2F13e414a2-3877-477f-bc2c-0b7dc5270547.JPG</url>
      <title>DEV Community: Ronak</title>
      <link>https://dev.to/ronakjain90</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ronakjain90"/>
    <language>en</language>
    <item>
      <title>Active Record delegated_type</title>
      <dc:creator>Ronak</dc:creator>
      <pubDate>Wed, 30 Sep 2020 16:30:32 +0000</pubDate>
      <link>https://dev.to/ronakjain90/active-record-delegatedtype-4od0</link>
      <guid>https://dev.to/ronakjain90/active-record-delegatedtype-4od0</guid>
      <description>&lt;p&gt;Rails 6 has added a new feature that adds &lt;code&gt;delegated_type&lt;/code&gt; to Active Record. In this blog post, we are going to learn how to use &lt;code&gt;delegated_type&lt;/code&gt; in our Active Record model using a real-life project and also discuss the benefits of using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project
&lt;/h2&gt;

&lt;p&gt;Implement a School Management System. The system will have &lt;code&gt;Users&lt;/code&gt; with different profiles. eg: Student, Teacher, Department Head, Support Staff.&lt;/p&gt;

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

&lt;p&gt;We are going to explore various possible solutions before jumping on to &lt;code&gt;delegated_type&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Single-table inheritance (STI)
&lt;/h3&gt;

&lt;p&gt;Single Table Inheritance as the name implies combines all the fields of various user profile and stores them in a single mega table. If a field is not needed for a specific user profile, its value will be &lt;code&gt;nil&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This is how the resultant mega table would look like.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;record_type&lt;/th&gt;
&lt;th&gt;grade&lt;/th&gt;
&lt;th&gt;department_name&lt;/th&gt;
&lt;th&gt;service_category&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;John&lt;/td&gt;
&lt;td&gt;student&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Doe&lt;/td&gt;
&lt;td&gt;student&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Borg&lt;/td&gt;
&lt;td&gt;teacher&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Math&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Eric&lt;/td&gt;
&lt;td&gt;teacher&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Anna&lt;/td&gt;
&lt;td&gt;support_staff&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Cleaning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Venice&lt;/td&gt;
&lt;td&gt;support_staff&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Admin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Issues&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This table will be sparsely filled with a lot of space wasted if each user profile has lots of divergence and little in common.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Abstract Class
&lt;/h3&gt;

&lt;p&gt;In this method, we would use an abstract class to scope out the shared code used between the various user profile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="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="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abstract_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;
    &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&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="c1"&gt;#Schema: students[ id, name, grade ]&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Student&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;#Schema: teachers[ id, name, department ]&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Teacher&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Student.create&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"John"&lt;/span&gt;, grade: 1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Student.first.say_hello
&lt;span class="s2"&gt;"Hello John"&lt;/span&gt; 

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Teacher.create&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"Lisa"&lt;/span&gt;, department: &lt;span class="s2"&gt;"English"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Teacher.first.say_hello
&lt;span class="s2"&gt;"Hello Lisa"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Issues&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tables are not normalized&lt;/li&gt;
&lt;li&gt;It's impossible to implement pagination of combined &lt;code&gt;Users&lt;/code&gt;. Even if one had to try, it would mean querying two tables simultaneously with no proper limits and offset. &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Multiple tables with an association
&lt;/h3&gt;

&lt;p&gt;Here we use one parent table to extract out all the common table attributes and use Active Record association to refer profile-specific data&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;#Schema: users[ id, name ]&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_one&lt;/span&gt; &lt;span class="ss"&gt;:student_profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name: &lt;/span&gt;&lt;span class="s2"&gt;"Student"&lt;/span&gt;
  &lt;span class="n"&gt;has_one&lt;/span&gt; &lt;span class="ss"&gt;:teacher_profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name: &lt;/span&gt;&lt;span class="s2"&gt;"Teacher"&lt;/span&gt;

  &lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="ss"&gt;user_type: &lt;/span&gt;&lt;span class="sx"&gt;%i(student teacher)&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;
    &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;profile&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;student_profile&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;student?&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;teacher_profile&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;teacher?&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;#Schema: teachers[ id, department, user_id ]&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Teacher&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="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;#Schema: students[ id, grade, user_id ]&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Student&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="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; User.where&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.first.profile.grade
1
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; User.where&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.say_hello
&lt;span class="s2"&gt;"Hello John"&lt;/span&gt; 

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; User.where&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"Lisa"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.first.profile.department
&lt;span class="s2"&gt;"English"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; User.where&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"Lisa"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.say_hello
&lt;span class="s2"&gt;"Hello Lisa"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Active Record &lt;code&gt;delegated_type&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Using Active Record with &lt;code&gt;delegated_type&lt;/code&gt; would be similar to multiple table with association, but it would abstract away all the conditional code giving us a neat slate. We have a parent table with common attributes &lt;code&gt;User&lt;/code&gt; and child table containing necessary profile information &lt;code&gt;Student&lt;/code&gt;, &lt;code&gt;Teacher&lt;/code&gt;.&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;#Schema: users[ id, name, profilable_type, profilable_id ]&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;delegated_type&lt;/span&gt; &lt;span class="ss"&gt;:profilable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;types: &lt;/span&gt;&lt;span class="sx"&gt;%w[ Student Teacher Support ]&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;
    &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&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="c1"&gt;#Schema: teachers[ id, department ]&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Teacher&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="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Profilable&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;#Schema: teachers[ id, grade ]&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Student&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="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Profilable&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Profilable&lt;/span&gt;
  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;

  &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;has_one&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;as: :profilable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;touch: &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;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Creating a new Record&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;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;create!&lt;/span&gt; &lt;span class="ss"&gt;profilable: &lt;/span&gt;&lt;span class="no"&gt;Student&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="ss"&gt;grade: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;
&lt;span class="o"&gt;&amp;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;create!&lt;/span&gt; &lt;span class="ss"&gt;profilable: &lt;/span&gt;&lt;span class="no"&gt;Teacher&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="ss"&gt;department: &lt;/span&gt;&lt;span class="s1"&gt;'Math'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Lisa"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Querying capability&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; User.where&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.first.profilable
  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;"name"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ? ORDER BY &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; ASC LIMIT ?  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;, &lt;span class="s2"&gt;"John"&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]]
  Student Load &lt;span class="o"&gt;(&lt;/span&gt;0.1ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"students"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"students"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"students"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ? LIMIT ?  &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]]
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Student id: 2, grade: 5&amp;gt; &lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; User.where&lt;span class="o"&gt;(&lt;/span&gt;name: &lt;span class="s2"&gt;"Lisa"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.first.profilable
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.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;"name"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ? ORDER BY &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; ASC LIMIT ?  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;, &lt;span class="s2"&gt;"Lisa"&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]]
  Teacher 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;"teachers"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"teachers"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"teachers"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ? LIMIT ?  &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]]
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Teacher id: 1, department: "Math"&amp;gt; &lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Teacher.where&lt;span class="o"&gt;(&lt;/span&gt;department: &lt;span class="s2"&gt;"Math"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.count
   &lt;span class="o"&gt;(&lt;/span&gt;0.2ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT COUNT&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; FROM &lt;span class="s2"&gt;"teachers"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"teachers"&lt;/span&gt;.&lt;span class="s2"&gt;"department"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ?  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"department"&lt;/span&gt;, &lt;span class="s2"&gt;"Math"&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 1 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Student.where&lt;span class="o"&gt;(&lt;/span&gt;grade: 5&lt;span class="o"&gt;)&lt;/span&gt;.first.user.name
  Student Load &lt;span class="o"&gt;(&lt;/span&gt;0.1ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="s2"&gt;"students"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"students"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"students"&lt;/span&gt;.&lt;span class="s2"&gt;"grade"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ? ORDER BY &lt;span class="s2"&gt;"students"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; ASC LIMIT ?  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"grade"&lt;/span&gt;, 5], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.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;"profilable_id"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ? AND &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"profilable_type"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ? LIMIT ?  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"profilable_id"&lt;/span&gt;, 2], &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"profilable_type"&lt;/span&gt;, &lt;span class="s2"&gt;"Student"&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]]
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"John"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can notice that &lt;code&gt;delegated_type&lt;/code&gt; is similar to multiple table with association, however, it abstracts out the&lt;br&gt;
 implementation details using rails magic. Pagination would now be possible for combined &lt;code&gt;User&lt;/code&gt; entity&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://acuments.com/10-rails-antipatterns-to-avoid-writing-well-reasoned-code.html"&gt;Rails Antipattern&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

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