Skip to content

Commit 79f3d55

Browse files
committed
Add concurrency section
1 parent 1042432 commit 79f3d55

File tree

2 files changed

+62
-9
lines changed

2 files changed

+62
-9
lines changed

_site/guides/concepts/resources.html

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ <h1 id="resources">Resources</h1>
158158
</ul>
159159
</li>
160160
<li>8 <a href="#context">Context</a></li>
161-
<li>9 <a href="#adapters">Adapters</a></li>
161+
<li>9 <a href="#concurrency">Concurrency</a></li>
162+
<li>10 <a href="#adapters">Adapters</a></li>
162163
</ul>
163164
</div>
164165

@@ -216,7 +217,7 @@ <h4>
216217
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">attribute</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:string</span><span class="p">,</span> <span class="ss">only: </span><span class="p">[</span><span class="ss">:sortable</span><span class="p">]</span>
217218
<span class="n">attribute</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:string</span><span class="p">,</span> <span class="ss">except: </span><span class="p">[</span><span class="ss">:writable</span><span class="p">]</span></code></pre></figure>
218219

219-
<p>The <code class="highlighter-rouge">schema</code> flag is not affected by <code class="highlighter-rouge">only/except</code> options.
220+
<p>The <code class="highlighter-rouge">schema</code> flag is not affected by <code class="highlighter-rouge">only/except</code> options.
220221
This option determines if the attribute is exported to the schema.json.</p>
221222

222223
<p>You might want to allow behavior only if a certain condition is met.
@@ -771,7 +772,7 @@ <h5>
771772
<p>If a filter is marked <code class="highlighter-rouge">single: true</code>, we’ll avoid any array parsing and
772773
escape the value for you, filtering on the string as given.</p>
773774

774-
<p>By default a value that comes in as <code class="highlighter-rouge">null</code> is treated as a string <code class="highlighter-rouge">"null"</code>.
775+
<p>By default a value that comes in as <code class="highlighter-rouge">null</code> is treated as a string <code class="highlighter-rouge">"null"</code>.
775776
To coerce <code class="highlighter-rouge">null</code> to a Ruby <code class="highlighter-rouge">nil</code> mark the filter with <code class="highlighter-rouge">allow_nil: true</code>.
776777
This can be changed for all attributes by setting <code class="highlighter-rouge">filters_accept_nil_by_default</code></p>
777778

@@ -1264,7 +1265,7 @@ <h5>
12641265

12651266
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># app/models/employee.rb</span>
12661267
<span class="n">has_many</span> <span class="ss">:positions</span>
1267-
<span class="n">has_one</span> <span class="ss">:current_position</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">{</span> <span class="n">where</span><span class="p">(</span><span class="ss">created_at: :desc</span><span class="p">)</span> <span class="p">}</span>
1268+
<span class="n">has_one</span> <span class="ss">:current_position</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">{</span> <span class="n">where</span><span class="p">(</span><span class="ss">created_at: :desc</span><span class="p">)</span> <span class="p">},</span> <span class="ss">class_name: </span><span class="s1">'Position'</span>
12681269

12691270
<span class="no">Employee</span><span class="p">.</span><span class="nf">includes</span><span class="p">(</span><span class="s1">'current_position'</span><span class="p">).</span><span class="nf">to_a</span>
12701271

@@ -1279,7 +1280,7 @@ <h5>
12791280

12801281
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># app/resources/employee_resource.rb</span>
12811282
<span class="n">has_many</span> <span class="ss">:positions</span>
1282-
<span class="n">has_one</span> <span class="ss">:current_position</span> <span class="k">do</span>
1283+
<span class="n">has_one</span> <span class="ss">:current_position</span><span class="p">,</span> <span class="ss">resource: </span><span class="no">PositionResource</span> <span class="k">do</span>
12831284
<span class="n">params</span> <span class="k">do</span> <span class="o">|</span><span class="nb">hash</span><span class="o">|</span>
12841285
<span class="nb">hash</span><span class="p">[</span><span class="ss">:sort</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'-created_at'</span>
12851286
<span class="k">end</span>
@@ -1302,7 +1303,7 @@ <h5>
13021303

13031304
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># app/models/employee.rb</span>
13041305
<span class="n">has_many</span> <span class="ss">:positions</span>
1305-
<span class="n">has_one</span> <span class="ss">:current_position</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">{</span> <span class="n">where</span><span class="p">(</span><span class="ss">historical_index: </span><span class="mi">1</span><span class="p">)</span> <span class="p">}</span>
1306+
<span class="n">has_one</span> <span class="ss">:current_position</span><span class="p">,</span> <span class="o">-&gt;</span> <span class="p">{</span> <span class="n">where</span><span class="p">(</span><span class="ss">historical_index: </span><span class="mi">1</span><span class="p">)</span> <span class="p">},</span> <span class="ss">class_name: </span><span class="s1">'Position'</span>
13061307

13071308
<span class="no">Employee</span><span class="p">.</span><span class="nf">includes</span><span class="p">(</span><span class="s1">'current_position'</span><span class="p">).</span><span class="nf">to_a</span>
13081309

@@ -1955,10 +1956,36 @@ <h2>
19551956
<span class="no">PostResource</span><span class="p">.</span><span class="nf">all</span>
19561957
<span class="k">end</span></code></pre></figure>
19571958

1959+
<a class="anchor" id="concurrency" />
1960+
<a class="header" href="#concurrency">
1961+
<h2>
1962+
9 Concurrency
1963+
</h2>
1964+
</a>
1965+
1966+
<p>By default when using Rails, Graphiti will turn on concurrency when <code class="highlighter-rouge">::Rails.application.config.cache_classes</code> is <code class="highlighter-rouge">true</code> (the default for staging and production environments). This will cause sibling sideloads to load concurrently. If a <code class="highlighter-rouge">Post</code> is sideloading <code class="highlighter-rouge">Comments</code> and <code class="highlighter-rouge">Author</code>, we’ll load both of those at the same time.</p>
1967+
1968+
<p>You can turn on/off this behavior explicitly:</p>
1969+
1970+
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"> <span class="c1"># config/intializers/graphiti.rb</span>
1971+
<span class="no">Graphiti</span><span class="p">.</span><span class="nf">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">c</span><span class="o">|</span>
1972+
<span class="n">c</span><span class="p">.</span><span class="nf">concurrency</span> <span class="o">=</span> <span class="kp">false</span>
1973+
<span class="k">end</span></code></pre></figure>
1974+
1975+
<p><strong>NOTE</strong>: Since this kicks off a new Thread, thread locals will be dropped. So if your code refers to <code class="highlighter-rouge">Thread.current[:foo]</code> you should set and get that on <code class="highlighter-rouge">Graphiti.context</code>:</p>
1976+
1977+
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"> <span class="c1"># BAD:</span>
1978+
<span class="no">Thread</span><span class="p">.</span><span class="nf">current</span><span class="p">[</span><span class="ss">:foo</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"bar"</span>
1979+
<span class="no">Thread</span><span class="p">.</span><span class="nf">current</span><span class="p">[</span><span class="ss">:foo</span><span class="p">]</span> <span class="c1"># =&gt; will be nil when sideloading!</span>
1980+
1981+
<span class="c1"># GOOD:</span>
1982+
<span class="no">Graphiti</span><span class="p">.</span><span class="nf">context</span><span class="p">[</span><span class="ss">:foo</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"bar"</span>
1983+
<span class="no">Graphiti</span><span class="p">.</span><span class="nf">context</span><span class="p">[</span><span class="ss">:foo</span><span class="p">]</span> <span class="c1"># =&gt; "bar", even when sideloading</span></code></pre></figure>
1984+
19581985
<a class="anchor" id="adapters" />
19591986
<a class="header" href="#adapters">
19601987
<h2>
1961-
9 Adapters
1988+
10 Adapters
19621989
</h2>
19631990
</a>
19641991

guides/concepts/resources.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ Resources
5050
* [Expanded Example](#expanded-example)
5151
* [Validation Errors](#validation-errors)
5252
* 8 [Context](#context)
53-
* 9 [Adapters](#adapters)
53+
* 9 [Concurrency](#concurrency)
54+
* 10 [Adapters](#adapters)
5455
</div>
5556

5657
<div markdown="1" class="col-md-8">
@@ -1783,7 +1784,32 @@ Graphiti.with_context(ctx) do
17831784
end
17841785
{% endhighlight %}
17851786

1786-
{% include h.html tag="h2" text="9 Adapters" a="adapters" %}
1787+
{% include h.html tag="h2" text="9 Concurrency" a="concurrency" %}
1788+
1789+
By default when using Rails, Graphiti will turn on concurrency when `::Rails.application.config.cache_classes` is `true` (the default for staging and production environments). This will cause sibling sideloads to load concurrently. If a `Post` is sideloading `Comments` and `Author`, we'll load both of those at the same time.
1790+
1791+
You can turn on/off this behavior explicitly:
1792+
1793+
{% highlight ruby %}
1794+
# config/intializers/graphiti.rb
1795+
Graphiti.configure do |c|
1796+
c.concurrency = false
1797+
end
1798+
{% endhighlight %}
1799+
1800+
**NOTE**: Since this kicks off a new Thread, thread locals will be dropped. So if your code refers to `Thread.current[:foo]` you should set and get that on `Graphiti.context`:
1801+
1802+
{% highlight ruby %}
1803+
# BAD:
1804+
Thread.current[:foo] = "bar"
1805+
Thread.current[:foo] # => will be nil when sideloading!
1806+
1807+
# GOOD:
1808+
Graphiti.context[:foo] = "bar"
1809+
Graphiti.context[:foo] # => "bar", even when sideloading
1810+
{% endhighlight %}
1811+
1812+
{% include h.html tag="h2" text="10 Adapters" a="adapters" %}
17871813

17881814
Common resource overrides can be packaged into an Adapter for code
17891815
re-use. The most common example is using a different client/datastore

0 commit comments

Comments
 (0)