|
36 | 36 | How do you solve it? More functions!</p>
|
37 | 37 | <h2>
|
38 | 38 | The Solution</h2>
|
39 |
| -<pre><code class="makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">get_thing</span><span class="p" data-group-id="1639973431-1">(</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">opts</span><span class="w"> </span><span class="o">\\</span><span class="w"> </span><span class="p" data-group-id="1639973431-2">[</span><span class="p" data-group-id="1639973431-2">]</span><span class="p" data-group-id="1639973431-1">)</span><span class="w"> </span><span class="k" data-group-id="1639973431-3">do</span><span class="w"> |
40 |
| - </span><span class="n">from</span><span class="p" data-group-id="1639973431-4">(</span><span class="n">t</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="nc">Thing</span><span class="p">,</span><span class="w"> </span><span class="ss">where</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="o">.</span><span class="n">id</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">^</span><span class="n">id</span><span class="p" data-group-id="1639973431-4">)</span><span class="w"> |
41 |
| - </span><span class="o">|></span><span class="w"> </span><span class="n">preload</span><span class="p" data-group-id="1639973431-5">(</span><span class="n">opts</span><span class="p" data-group-id="1639973431-6">[</span><span class="ss">:preload</span><span class="p" data-group-id="1639973431-6">]</span><span class="p" data-group-id="1639973431-5">)</span><span class="w"> |
42 |
| - </span><span class="o">|></span><span class="w"> </span><span class="nc">Repo</span><span class="o">.</span><span class="n">one</span><span class="p" data-group-id="1639973431-7">(</span><span class="p" data-group-id="1639973431-7">)</span><span class="w"> |
43 |
| -</span><span class="k" data-group-id="1639973431-3">end</span><span class="w"> |
| 39 | +<pre><code class="makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">get_thing</span><span class="p" data-group-id="6084835655-1">(</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">opts</span><span class="w"> </span><span class="o">\\</span><span class="w"> </span><span class="p" data-group-id="6084835655-2">[</span><span class="p" data-group-id="6084835655-2">]</span><span class="p" data-group-id="6084835655-1">)</span><span class="w"> </span><span class="k" data-group-id="6084835655-3">do</span><span class="w"> |
| 40 | + </span><span class="n">from</span><span class="p" data-group-id="6084835655-4">(</span><span class="n">t</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="nc">Thing</span><span class="p">,</span><span class="w"> </span><span class="ss">where</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="o">.</span><span class="n">id</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">^</span><span class="n">id</span><span class="p" data-group-id="6084835655-4">)</span><span class="w"> |
| 41 | + </span><span class="o">|></span><span class="w"> </span><span class="n">preload</span><span class="p" data-group-id="6084835655-5">(</span><span class="n">opts</span><span class="p" data-group-id="6084835655-6">[</span><span class="ss">:preload</span><span class="p" data-group-id="6084835655-6">]</span><span class="p" data-group-id="6084835655-5">)</span><span class="w"> |
| 42 | + </span><span class="o">|></span><span class="w"> </span><span class="nc">Repo</span><span class="o">.</span><span class="n">one</span><span class="p" data-group-id="6084835655-7">(</span><span class="p" data-group-id="6084835655-7">)</span><span class="w"> |
| 43 | +</span><span class="k" data-group-id="6084835655-3">end</span><span class="w"> |
44 | 44 |
|
45 |
| -</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="1639973431-8">(</span><span class="n">query</span><span class="p" data-group-id="1639973431-8">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">preload</span><span class="p" data-group-id="1639973431-9">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="1639973431-9">)</span><span class="w"> |
46 |
| -</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="1639973431-10">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">nil</span><span class="p" data-group-id="1639973431-10">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">query</span><span class="w"> |
| 45 | +</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="6084835655-8">(</span><span class="n">query</span><span class="p" data-group-id="6084835655-8">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">preload</span><span class="p" data-group-id="6084835655-9">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="6084835655-9">)</span><span class="w"> |
| 46 | +</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="6084835655-10">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">nil</span><span class="p" data-group-id="6084835655-10">)</span><span class="p">,</span><span class="w"> </span><span class="ss">do</span><span class="p">:</span><span class="w"> </span><span class="n">query</span><span class="w"> |
47 | 47 |
|
48 |
| -</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="1639973431-11">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="1639973431-11">)</span><span class="w"> </span><span class="k" data-group-id="1639973431-12">do</span><span class="w"> |
| 48 | +</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="6084835655-11">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="6084835655-11">)</span><span class="w"> </span><span class="k" data-group-id="6084835655-12">do</span><span class="w"> |
49 | 49 | </span><span class="n">from</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">query</span><span class="p">,</span><span class="w">
|
50 |
| - </span><span class="ss">left_join</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">assoc</span><span class="p" data-group-id="1639973431-13">(</span><span class="n">q</span><span class="p">,</span><span class="w"> </span><span class="ss">:thing</span><span class="p" data-group-id="1639973431-13">)</span><span class="p">,</span><span class="w"> |
51 |
| - </span><span class="ss">left_join</span><span class="p">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">assoc</span><span class="p" data-group-id="1639973431-14">(</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="ss">:sub_thing</span><span class="p" data-group-id="1639973431-14">)</span><span class="p">,</span><span class="w"> |
52 |
| - </span><span class="ss">preload</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="1639973431-15">[</span><span class="w"> |
53 |
| - </span><span class="ss">thing</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="1639973431-16">{</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="1639973431-17">[</span><span class="ss">sub_thing</span><span class="p">:</span><span class="w"> </span><span class="n">s</span><span class="p" data-group-id="1639973431-17">]</span><span class="p" data-group-id="1639973431-16">}</span><span class="w"> |
54 |
| - </span><span class="p" data-group-id="1639973431-15">]</span><span class="p">,</span><span class="w"> |
55 |
| - </span><span class="ss">order_by</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="1639973431-18">[</span><span class="ss">asc</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="o">.</span><span class="n">index</span><span class="p" data-group-id="1639973431-18">]</span><span class="w"> |
| 50 | + </span><span class="ss">left_join</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">assoc</span><span class="p" data-group-id="6084835655-13">(</span><span class="n">q</span><span class="p">,</span><span class="w"> </span><span class="ss">:thing</span><span class="p" data-group-id="6084835655-13">)</span><span class="p">,</span><span class="w"> |
| 51 | + </span><span class="ss">left_join</span><span class="p">:</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">assoc</span><span class="p" data-group-id="6084835655-14">(</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="ss">:sub_thing</span><span class="p" data-group-id="6084835655-14">)</span><span class="p">,</span><span class="w"> |
| 52 | + </span><span class="ss">preload</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6084835655-15">[</span><span class="w"> |
| 53 | + </span><span class="ss">thing</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6084835655-16">{</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6084835655-17">[</span><span class="ss">sub_thing</span><span class="p">:</span><span class="w"> </span><span class="n">s</span><span class="p" data-group-id="6084835655-17">]</span><span class="p" data-group-id="6084835655-16">}</span><span class="w"> |
| 54 | + </span><span class="p" data-group-id="6084835655-15">]</span><span class="p">,</span><span class="w"> |
| 55 | + </span><span class="ss">order_by</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="6084835655-18">[</span><span class="ss">asc</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="o">.</span><span class="n">index</span><span class="p" data-group-id="6084835655-18">]</span><span class="w"> |
56 | 56 | </span><span class="p">]</span><span class="w">
|
57 |
| -</span><span class="k" data-group-id="1639973431-12">end</span><span class="w"> |
| 57 | +</span><span class="k" data-group-id="6084835655-12">end</span><span class="w"> |
58 | 58 |
|
59 |
| -</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="1639973431-19">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="n">preloads</span><span class="p" data-group-id="1639973431-19">)</span><span class="w"> </span><span class="k" data-group-id="1639973431-20">do</span><span class="w"> |
| 59 | +</span><span class="kd">defp</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="6084835655-19">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="n">preloads</span><span class="p" data-group-id="6084835655-19">)</span><span class="w"> </span><span class="k" data-group-id="6084835655-20">do</span><span class="w"> |
60 | 60 | </span><span class="n">from</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="ss">preload</span><span class="p">:</span><span class="w"> </span><span class="o">^</span><span class="n">preloads</span><span class="w">
|
61 |
| -</span><span class="k" data-group-id="1639973431-20">end</span></code></pre> |
| 61 | +</span><span class="k" data-group-id="6084835655-20">end</span></code></pre> |
62 | 62 | <p>
|
63 | 63 | Edit: I made a mistake here originally. Thanks to <a href="https://twitter.com/atomkirk">@AtomKirk</a> for pointing it out!</p>
|
64 | 64 | <p>
|
65 | 65 | What I had originally was:</p>
|
66 |
| -<pre><code class="makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="5371036471-1">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="5371036471-1">)</span><span class="w"> </span><span class="k" data-group-id="5371036471-2">do</span><span class="w"> |
67 |
| - </span><span class="n">from</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="ss">preload</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="5371036471-3">[</span><span class="w"> |
| 66 | +<pre><code class="makeup elixir"><span class="kd">def</span><span class="w"> </span><span class="nf">preload</span><span class="p" data-group-id="3439478271-1">(</span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="no">true</span><span class="p" data-group-id="3439478271-1">)</span><span class="w"> </span><span class="k" data-group-id="3439478271-2">do</span><span class="w"> |
| 67 | + </span><span class="n">from</span><span class="w"> </span><span class="n">q</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">query</span><span class="p">,</span><span class="w"> </span><span class="ss">preload</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3439478271-3">[</span><span class="w"> |
68 | 68 | </span><span class="ss">:association</span><span class="p">,</span><span class="w">
|
69 |
| - </span><span class="ss">other_assoc</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="5371036471-4">[</span><span class="ss">:sub_assoc</span><span class="p" data-group-id="5371036471-4">]</span><span class="w"> |
70 |
| - </span><span class="p" data-group-id="5371036471-3">]</span><span class="w"> |
71 |
| -</span><span class="k" data-group-id="5371036471-2">end</span></code></pre> |
| 69 | + </span><span class="ss">other_assoc</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3439478271-4">[</span><span class="ss">:sub_assoc</span><span class="p" data-group-id="3439478271-4">]</span><span class="w"> |
| 70 | + </span><span class="p" data-group-id="3439478271-3">]</span><span class="w"> |
| 71 | +</span><span class="k" data-group-id="3439478271-2">end</span></code></pre> |
72 | 72 | <p>
|
73 | 73 | However, this is incorrect. The correct way to do this is to use the <code class="inline">left_join</code> with <code class="inline">assoc</code> functions.</p>
|
74 | 74 | <p>
|
75 | 75 | What I described originally was how <a href="https://ash-hq.org/">Ash</a> does it. In Ash, you’d do something like:</p>
|
76 |
| -<pre><code class="makeup elixir"><span class="nc">Ash</span><span class="o">.</span><span class="n">get!</span><span class="p" data-group-id="5669712451-1">(</span><span class="nc">Thing</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">load</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="5669712451-2">[</span><span class="ss">:association</span><span class="p">,</span><span class="w"> </span><span class="ss">other_assoc</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="5669712451-3">[</span><span class="ss">:sub_assoc</span><span class="p" data-group-id="5669712451-3">]</span><span class="p" data-group-id="5669712451-2">]</span><span class="p" data-group-id="5669712451-1">)</span></code></pre> |
| 76 | +<pre><code class="makeup elixir"><span class="nc">Ash</span><span class="o">.</span><span class="n">get!</span><span class="p" data-group-id="3871777538-1">(</span><span class="nc">Thing</span><span class="p">,</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="ss">load</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3871777538-2">[</span><span class="ss">:association</span><span class="p">,</span><span class="w"> </span><span class="ss">other_assoc</span><span class="p">:</span><span class="w"> </span><span class="p" data-group-id="3871777538-3">[</span><span class="ss">:sub_assoc</span><span class="p" data-group-id="3871777538-3">]</span><span class="p" data-group-id="3871777538-2">]</span><span class="p" data-group-id="3871777538-1">)</span></code></pre> |
77 | 77 | <p>
|
78 | 78 | For a more explicit example, check out <a href="https://github.com/andyleclair/garage/blob/main/lib/garage_web/live/builds_live/show.ex#L197">this code here</a></p>
|
79 | 79 |
|
|
0 commit comments