<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Thuan Nguyen Van, Author at Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/author/thuannguyenvan/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/author/thuannguyenvan/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Thu, 18 Jan 2024 01:46:01 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Thuan Nguyen Van, Author at Tomoshare</title>
	<link>https://blog.tomosia.com.vn/author/thuannguyenvan/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[Rails Tips] Rails 7.1 &#8211; ActiveRecord::QueryMethods#select has added support for hash values</title>
		<link>https://blog.tomosia.com.vn/rails-tips-rails-7-1-activerecordquerymethodsselect-has-added-support-for-hash-values/</link>
					<comments>https://blog.tomosia.com.vn/rails-tips-rails-7-1-activerecordquerymethodsselect-has-added-support-for-hash-values/#comments</comments>
		
		<dc:creator><![CDATA[Thuan Nguyen Van]]></dc:creator>
		<pubDate>Thu, 18 Jan 2024 01:45:59 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Rails7.1]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3011</guid>

					<description><![CDATA[<p>Trong bản cập nhật mới nhất của, Rails 7.1 đã cho phép chúng ta query select theo giá&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/rails-tips-rails-7-1-activerecordquerymethodsselect-has-added-support-for-hash-values/">[Rails Tips] Rails 7.1 &#8211; ActiveRecord::QueryMethods#select has added support for hash values</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Trong bản cập nhật mới nhất của, Rails 7.1 đã cho phép chúng ta query <strong>select</strong> theo giá trị hash chứ không cần phải sử dụng <strong>raw SQL</strong> nữa.</p>



<p>💎 Improvements:<br>1️⃣ New support query với giá trị <strong>Hash</strong><br>2️⃣ Chúng ta không cần phải dùng truy vấn <strong>raw version</strong> nữa</p>



<p>💎 Bonus:<br>1️⃣ Cú pháp mới cũng support chúng ta sử dụng <strong>alias</strong><br>2️⃣ Sử dụng tương tự cho ActiveRecord#reselect</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# Before Rails 7.1

Post.joins(:comments)
    .select(
      &quot;posts.id as post_id, posts.title as post_title,
      comments.id as comment_id, comments.body as comment_body&quot;
    )
    
Post.joins(:comments).select(:id, :title, &quot;comments.body&quot;)

# After Rails 7.1

Post.joins(:comments)
    .select(
      posts: { id: :post_id, title: :post_title },
      comments: { id: :comments_id, body: :comment_body }
    )
    
Post.joins(:comments).select(:id, :title, comments: [:body] )" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># Before Rails 7.1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #97E1F1; font-style: italic">Post</span><span style="color: #F6F6F4">.joins(</span><span style="color: #BF9EEE">:comments</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    .</span><span style="color: #97E1F1">select</span><span style="color: #F6F6F4">(</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">posts.id as post_id, posts.title as post_title,</span></span>
<span class="line"><span style="color: #E7EE98">      comments.id as comment_id, comments.body as comment_body</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">    )</span></span>
<span class="line"><span style="color: #F6F6F4">    </span></span>
<span class="line"><span style="color: #97E1F1; font-style: italic">Post</span><span style="color: #F6F6F4">.joins(</span><span style="color: #BF9EEE">:comments</span><span style="color: #F6F6F4">).</span><span style="color: #97E1F1">select</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">:id</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">:title</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">comments.body</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B"># After Rails 7.1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #97E1F1; font-style: italic">Post</span><span style="color: #F6F6F4">.joins(</span><span style="color: #BF9EEE">:comments</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    .</span><span style="color: #97E1F1">select</span><span style="color: #F6F6F4">(</span></span>
<span class="line"><span style="color: #F6F6F4">      posts</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> { id</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">:post_id</span><span style="color: #F6F6F4">, title</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">:post_title</span><span style="color: #F6F6F4"> },</span></span>
<span class="line"><span style="color: #F6F6F4">      comments</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> { id</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">:comments_id</span><span style="color: #F6F6F4">, body</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">:comment_body</span><span style="color: #F6F6F4"> }</span></span>
<span class="line"><span style="color: #F6F6F4">    )</span></span>
<span class="line"><span style="color: #F6F6F4">    </span></span>
<span class="line"><span style="color: #97E1F1; font-style: italic">Post</span><span style="color: #F6F6F4">.joins(</span><span style="color: #BF9EEE">:comments</span><span style="color: #F6F6F4">).</span><span style="color: #97E1F1">select</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">:id</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">:title</span><span style="color: #F6F6F4">, comments</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> [</span><span style="color: #BF9EEE">:body</span><span style="color: #F6F6F4">] )</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="956" height="551" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-14.42.49.png" alt="" class="wp-image-3016" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-14.42.49.png 956w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-14.42.49-300x173.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-14.42.49-768x443.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-14.42.49-380x219.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-14.42.49-800x461.png 800w" sizes="(max-width: 956px) 100vw, 956px" /></figure>
<p>The post <a href="https://blog.tomosia.com.vn/rails-tips-rails-7-1-activerecordquerymethodsselect-has-added-support-for-hash-values/">[Rails Tips] Rails 7.1 &#8211; ActiveRecord::QueryMethods#select has added support for hash values</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/rails-tips-rails-7-1-activerecordquerymethodsselect-has-added-support-for-hash-values/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>[ROR] Hướng dẫn setup CircleCI &#038; Code Quality</title>
		<link>https://blog.tomosia.com.vn/ror-huong-dan-setup-circleci-code-quality/</link>
					<comments>https://blog.tomosia.com.vn/ror-huong-dan-setup-circleci-code-quality/#comments</comments>
		
		<dc:creator><![CDATA[Thuan Nguyen Van]]></dc:creator>
		<pubDate>Wed, 22 Nov 2023 01:28:06 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[CI/CD]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Circle CI]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1808</guid>

					<description><![CDATA[<p>Step 1: Access https://circleci.com/ and authorize a Github, Gitlab or Bitbucket account. I will use a Github account.&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/ror-huong-dan-setup-circleci-code-quality/">[ROR] Hướng dẫn setup CircleCI &#038; Code Quality</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>Step 1:</strong> Access <a href="https://circleci.com/">https://circleci.com/</a> and authorize a Github, Gitlab or Bitbucket account. I will use a Github account.</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/4-a7bO8VFdZjsOip_gK60WMFnOZJ0dD1PwI8ykJHCpPzJs-jjSvZekKGaQc7yth9dUIbdztuP4NDEC1F-xZMe7RDDys9RCbHf9EVDAIUCbvV2f9wvw-ZeUZH29uU_I72eS59O0zAyeOl88ueOYbhTw" alt=""/></figure>



<p><strong>Step 2</strong>: Click <strong>Go to Application </strong>in Home page -&gt; Projects</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="671" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-1024x671.png" alt="" class="wp-image-1828" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-1024x671.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-300x197.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-768x503.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-1536x1007.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-2048x1342.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-380x249.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-800x524.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25-1160x760.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.25.png 2206w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Step 3</strong>: Click to Setup Project button in the right Repo you want to setup</p>



<p><strong>Step 4</strong>: Select first Radio Button -&gt; Set Up Project</p>



<figure class="wp-block-image size-full"><img decoding="async" width="960" height="820" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.54.png" alt="" class="wp-image-1830" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.54.png 960w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.54-300x256.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.54-768x656.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.54-380x325.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.46.54-800x683.png 800w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<p>After setup, click <strong>Dashboard </strong>and display as below</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="555" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-1024x555.png" alt="" class="wp-image-1831" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-1024x555.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-300x163.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-768x417.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-1536x833.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-2048x1111.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-380x206.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-800x434.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23-1160x629.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-11-15-at-08.49.23.png 2360w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Step 5</strong>: Click <strong>Project Setting -&gt; SSH Key </strong>and check if the ssh key has been linked or not.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="602" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-1024x602.png" alt="" class="wp-image-1926" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-1024x602.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-300x176.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-768x452.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-1536x903.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-380x223.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-800x471.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2-1160x682.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.37.42-2.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Step 6: <strong>If you using Git Submodule,</strong> please create a Additional SSH Keys</p>



<ol class="wp-block-list">
<li>Open terminal and run <strong><code>ssh-keygen -t ed25519 -C "Circle CI".</code></strong></li>



<li>Click Add SSH Key and enter</li>
</ol>



<ul class="wp-block-list">
<li>Hostname: <strong>github.com</strong></li>



<li>Private Key: cat <strong>minh_id_ed25519</strong>, copy and paste</li>
</ul>



<ol class="wp-block-list" start="3">
<li>Back to Github, select Repository <strong>Shared submodule</strong> -&gt; <strong>Settings</strong> -&gt; <strong>Deploy Keys</strong> -&gt; <strong>Add deploy key</strong></li>



<li>Enter Title and Key -&gt; <strong>Add Key</strong></li>
</ol>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="524" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-1024x524.png" alt="" class="wp-image-1927" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-1024x524.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-300x154.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-768x393.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-1536x786.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-380x195.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-800x410.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3-1160x594.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.38.40-3.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/DMqD1X_4hArkrqNjTitIIFNRe2HXnxxUpBu37aJgAH9XYYzgoDI2aE7GX8VLqt8cmKZiCl1EV0Nq_p7A7eOGg0ISwUcWUK-LdAqZdLg0heEL8GCH1qzpQI0lAHQxrtRcWJgnnSufCW9wVii8a7HUZQ" alt=""/></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="810" height="511" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.48.56.png" alt="" class="wp-image-1928" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.48.56.png 810w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.48.56-300x189.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.48.56-768x485.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.48.56-380x240.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-10.48.56-800x505.png 800w" sizes="auto, (max-width: 810px) 100vw, 810px" /></figure>



<p><strong>Step 7</strong>: Back to project setup config CircleCI and Danger</p>



<ol class="wp-block-list">
<li>Add to Gemfile</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="gem 'brakeman', require: false
gem 'danger', '9.2.0'
# A Danger plugin to lint Ruby files through danger-brakeman_scanner.&lt;/em&gt;
gem 'danger-brakeman_scanner', '0.1.1'
# A Danger plugin to lint Ruby files through rails_best_practices.&lt;/em&gt;
gem 'danger-rails_best_practices', '0.1.3'
# A Danger plugin to lint Ruby files through Reek.&lt;/em&gt;
gem 'danger-reek', '0.3.0'
# A Danger plugin for running Ruby files through Rubocop.&lt;/em&gt;
gem 'danger-rubocop', '0.10.0'
# A Danger plugin to report code coverage generated by SimpleCov in JSON format.&lt;/em&gt;
gem 'danger-simplecov_json', '0.3.0'" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">brakeman</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, require</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">danger</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">9.2.0</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #7B7F8B"># A Danger plugin to lint Ruby files through danger-brakeman_scanner.&lt;/em&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">danger-brakeman_scanner</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">0.1.1</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #7B7F8B"># A Danger plugin to lint Ruby files through rails_best_practices.&lt;/em&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">danger-rails_best_practices</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">0.1.3</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #7B7F8B"># A Danger plugin to lint Ruby files through Reek.&lt;/em&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">danger-reek</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">0.3.0</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #7B7F8B"># A Danger plugin for running Ruby files through Rubocop.&lt;/em&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">danger-rubocop</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">0.10.0</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #7B7F8B"># A Danger plugin to report code coverage generated by SimpleCov in JSON format.&lt;/em&gt;</span></span>
<span class="line"><span style="color: #F6F6F4">gem </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">danger-simplecov_json</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">0.3.0</span><span style="color: #DEE492">&#39;</span></span></code></pre></div>



<ol class="wp-block-list" start="2">
<li>Create file in <strong>.circleci/config.yml</strong> and paste code</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:25.296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# Best practises:
#   [https://www.netguru.com/blog/top-10-best-practises-to-benefit-more-form-circleci]
#   [https://circleci.com/blog/six-optimization-tips-for-your-config/]
references:
  working_directory: &amp;working_directory ~/quinblog
  images:
    base_image: &amp;base_image
      image: cimg/ruby:3.2.1
      environment:
        TZ: /usr/share/zoneinfo/Asia/Tokyo
        BUNDLE_JOBS: 4
        BUNDLE_RETRY: 3
        BUNDLE_PATH: vendor/bundle
        GEM_PATH: vendor/bundle
        RAILS_ENV: test
    db_image: &amp;db_image
      image: cimg/postgres:14.4
      environment:
        POSTGRES_USER: postgres
        POSTGRES_DB: quinblog_test
        POSTGRES_PASSWORD: postgres
    redis_image: &amp;redis_image
      image: cimg/redis:5.0
    mongodb_image: &amp;mongodb_image
      image: circleci/mongo:3.6
  commands:
    move_database_yml: &amp;move_database_yml
      name: Move database_yml
      command: mv config/database.ci.yml config/database.yml
    move_mongoid_yml: &amp;move_mongoid_yml
      name: Move mongoid_yml
      command: mv config/mongoid.ci.yml config/mongoid.yml
    sync_git_submodule: &amp;sync_git_submodule
      name: Sync git submodule
      command: |
        git submodule sync --recursive --quiet
        git submodule update --init --checkout --recursive --quiet

# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
version: 2.1

# Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects.
# See: https://circleci.com/docs/2.0/orb-intro/
orbs:
  ruby: circleci/ruby@1.8.0

# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
  build:
    working_directory: *working_directory
    resource_class: small
    parallelism: 1
    docker:
      - *base_image
    steps:
      - add_ssh_keys:
          fingerprints:
            - '7c:72:77:4f:79:12:cb:af:c9:84:7b:d1:ab:24:69:41'
      - checkout

      - run: *move_database_yml
      - run: *move_mongoid_yml
      - run: *sync_git_submodule
      - run:
          name: Disabled auto completion
          command: echo 'IRB.conf[:USE_AUTOCOMPLETE] = false' &gt;&gt; ~/.irbrc

      # Restoring and saving cache
      - ruby/install-deps

      - persist_to_workspace:
          root: *working_directory
          paths:
            - ./*

  test:
    working_directory: *working_directory
    resource_class: small
    parallelism: 2
    docker:
      - *base_image
      - *db_image
      - *mongodb_image
      - *redis_image
    steps:
      - attach_workspace:
          at: *working_directory

      - run:
          name: Wait for Postgres DB
          command: dockerize -wait tcp://localhost:5432 -timeout 1m

      - run:
          name: Wait for Mongo DB
          command: dockerize -wait tcp://localhost:27017 -timeout 1m

      - run:
          name: Wait for Redis DB
          command: dockerize -wait tcp://localhost:6379 -timeout 1m

      - run:
          name: Migration DB
          command: |
            bundle exec rails db:schema:load:primary --trace
            bundle exec rails db:create:universal
            bundle exec rails db:schema:load:universal --trace

      - run:
          name: Run rspec
          command: |
            TESTFILES=$(circleci tests glob &quot;spec/**/*_spec.rb&quot; | circleci tests split --split-by=timings --timings-type=classname)
            echo ${TESTFILES}
            bundle exec rspec --profile 10 \
                              --format progress \
                              --format RspecJunitFormatter --out /tmp/test-results/rspec/rspec.xml \
                              ${TESTFILES}

      # Collect test data
      # See: https://circleci.com/docs/collect-test-data
      # See: https://circleci.com/blog/how-to-output-junit-tests-through-circleci-2-0-for-expanded-insights/
      - store_test_results:
          path: /tmp/test-results/rspec/

      - run:
          name: Run danger
          command: bundle exec danger --danger_id=test

  lint:
    working_directory: *working_directory
    resource_class: small
    parallelism: 1
    docker:
      - *base_image
    steps:
      - attach_workspace:
          at: *working_directory

      - run:
          name: Run danger
          command: bundle exec danger --danger_id=lint

# Invoke jobs via workflows
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
workflows:
  build_and_test:
    jobs:
      - build
      - test:
          context:
            - ctx_renew_api_company
          requires:
            - build
      - lint:
          context:
            - ctx_renew_api_company
          requires:
            - build
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># Best practises:</span></span>
<span class="line"><span style="color: #7B7F8B">#   [https://www.netguru.com/blog/top-10-best-practises-to-benefit-more-form-circleci]</span></span>
<span class="line"><span style="color: #7B7F8B">#   [https://circleci.com/blog/six-optimization-tips-for-your-config/]</span></span>
<span class="line"><span style="color: #F6F6F4">references</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">  working_directory</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;</span><span style="color: #F6F6F4">working_directory </span><span style="color: #F286C4">~</span><span style="color: #E7EE98">/quinblog</span></span>
<span class="line"><span style="color: #E7EE98">  images:</span></span>
<span class="line"><span style="color: #E7EE98">    base_image: &amp;base_image</span></span>
<span class="line"><span style="color: #E7EE98">      image: cimg/</span><span style="color: #F6F6F4">ruby</span><span style="color: #F286C4">:</span><span style="color: #BF9EEE">3.2</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">1</span></span>
<span class="line"><span style="color: #F6F6F4">      environment</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">        TZ</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">/usr/s</span><span style="color: #F6F6F4">hare</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">zoneinfo</span><span style="color: #F286C4">/</span><span style="color: #BF9EEE">Asia</span><span style="color: #F286C4">/</span><span style="color: #BF9EEE">Tokyo</span></span>
<span class="line"><span style="color: #F6F6F4">        BUNDLE_JOBS</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">4</span></span>
<span class="line"><span style="color: #F6F6F4">        BUNDLE_RETRY</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">3</span></span>
<span class="line"><span style="color: #F6F6F4">        BUNDLE_PATH</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> vendor</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">bundle</span></span>
<span class="line"><span style="color: #F6F6F4">        GEM_PATH</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> vendor</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">bundle</span></span>
<span class="line"><span style="color: #F6F6F4">        RAILS_ENV</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">test</span></span>
<span class="line"><span style="color: #F6F6F4">    db_image</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;</span><span style="color: #F6F6F4">db_image</span></span>
<span class="line"><span style="color: #F6F6F4">      image</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> cimg</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">postgres</span><span style="color: #F286C4">:</span><span style="color: #BF9EEE">14.4</span></span>
<span class="line"><span style="color: #F6F6F4">      environment</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">        POSTGRES_USER</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> postgres</span></span>
<span class="line"><span style="color: #F6F6F4">        POSTGRES_DB</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> quinblog_test</span></span>
<span class="line"><span style="color: #F6F6F4">        POSTGRES_PASSWORD</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> postgres</span></span>
<span class="line"><span style="color: #F6F6F4">    redis_image</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;</span><span style="color: #F6F6F4">redis_image</span></span>
<span class="line"><span style="color: #F6F6F4">      image</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> cimg</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">redis</span><span style="color: #F286C4">:</span><span style="color: #BF9EEE">5.0</span></span>
<span class="line"><span style="color: #F6F6F4">    mongodb_image</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;</span><span style="color: #F6F6F4">mongodb_image</span></span>
<span class="line"><span style="color: #F6F6F4">      image</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> circleci</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">mongo</span><span style="color: #F286C4">:</span><span style="color: #BF9EEE">3.6</span></span>
<span class="line"><span style="color: #F6F6F4">  commands</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">    move_database_yml</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;</span><span style="color: #F6F6F4">move_database_yml</span></span>
<span class="line"><span style="color: #F6F6F4">      name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Move</span><span style="color: #F6F6F4"> database_yml</span></span>
<span class="line"><span style="color: #F6F6F4">      command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> mv config</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">database.ci.yml config</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">database.yml</span></span>
<span class="line"><span style="color: #F6F6F4">    move_mongoid_yml</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;</span><span style="color: #F6F6F4">move_mongoid_yml</span></span>
<span class="line"><span style="color: #F6F6F4">      name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Move</span><span style="color: #F6F6F4"> mongoid_yml</span></span>
<span class="line"><span style="color: #F6F6F4">      command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> mv config</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">mongoid.ci.yml config</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">mongoid.yml</span></span>
<span class="line"><span style="color: #F6F6F4">    sync_git_submodule</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;</span><span style="color: #F6F6F4">sync_git_submodule</span></span>
<span class="line"><span style="color: #F6F6F4">      name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Sync</span><span style="color: #F6F6F4"> git submodule</span></span>
<span class="line"><span style="color: #F6F6F4">      command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">|</span></span>
<span class="line"><span style="color: #F6F6F4">        git submodule sync </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">recursive </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">quiet</span></span>
<span class="line"><span style="color: #F6F6F4">        git submodule update </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">init </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">checkout </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">recursive </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">quiet</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B"># Use the latest 2.1 version of CircleCI pipeline process engine.</span></span>
<span class="line"><span style="color: #7B7F8B"># See: https://circleci.com/docs/2.0/configuration-reference</span></span>
<span class="line"><span style="color: #F6F6F4">version</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">2.1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B"># Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects.</span></span>
<span class="line"><span style="color: #7B7F8B"># See: https://circleci.com/docs/2.0/orb-intro/</span></span>
<span class="line"><span style="color: #F6F6F4">orbs</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">  ruby</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> circleci</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">ruby@</span><span style="color: #BF9EEE">1.8</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B"># Define a job to be invoked later in a workflow.</span></span>
<span class="line"><span style="color: #7B7F8B"># See: https://circleci.com/docs/2.0/configuration-reference/#jobs</span></span>
<span class="line"><span style="color: #F6F6F4">jobs</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">  build</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">    working_directory</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">working_directory</span></span>
<span class="line"><span style="color: #F6F6F4">    resource_class</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> small</span></span>
<span class="line"><span style="color: #F6F6F4">    parallelism</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1</span></span>
<span class="line"><span style="color: #F6F6F4">    docker</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">base_image</span></span>
<span class="line"><span style="color: #F6F6F4">    steps</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> add_ssh_keys</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          fingerprints</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">7c:72:77:4f:79:12:cb:af:c9:84:7b:d1:ab:24:69:41</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> checkout</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">move_database_yml</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">move_mongoid_yml</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">sync_git_submodule</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Disabled</span><span style="color: #F6F6F4"> auto completion</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> echo </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">IRB.conf[:USE_AUTOCOMPLETE] = false</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&gt;&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">~</span><span style="color: #E7EE98">/.irbrc</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E7EE98">      </span><span style="color: #7B7F8B"># Restoring and saving cache</span></span>
<span class="line"><span style="color: #E7EE98">      - ruby/ins</span><span style="color: #F6F6F4">tall</span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">deps</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> persist_to_workspace</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          root</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">working_directory</span></span>
<span class="line"><span style="color: #F6F6F4">          paths</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> .</span><span style="color: #F286C4">/*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  test</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">    working_directory</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">working_directory</span></span>
<span class="line"><span style="color: #F6F6F4">    resource_class</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> small</span></span>
<span class="line"><span style="color: #F6F6F4">    parallelism</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">2</span></span>
<span class="line"><span style="color: #F6F6F4">    docker</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">base_image</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">db_image</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">mongodb_image</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">redis_image</span></span>
<span class="line"><span style="color: #F6F6F4">    steps</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> attach_workspace</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          at</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">working_directory</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Wait</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">for</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Postgres</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">DB</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> dockerize </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">wait tcp</span><span style="color: #F286C4">:</span><span style="color: #E7EE98">//</span><span style="color: #F6F6F4">localhost</span><span style="color: #F286C4">:</span><span style="color: #BF9EEE">5432</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">timeout 1m</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Wait</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">for</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Mongo</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">DB</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> dockerize </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">wait tcp</span><span style="color: #F286C4">:</span><span style="color: #E7EE98">//</span><span style="color: #F6F6F4">localhost</span><span style="color: #F286C4">:</span><span style="color: #BF9EEE">27017</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">timeout 1m</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Wait</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">for</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Redis</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">DB</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> dockerize </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">wait tcp</span><span style="color: #F286C4">:</span><span style="color: #E7EE98">//</span><span style="color: #F6F6F4">localhost</span><span style="color: #F286C4">:</span><span style="color: #BF9EEE">6379</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">timeout 1m</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Migration</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">DB</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">|</span></span>
<span class="line"><span style="color: #F6F6F4">            bundle </span><span style="color: #97E1F1">exec</span><span style="color: #F6F6F4"> rails db</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">schema</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">load</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">primary </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">trace</span></span>
<span class="line"><span style="color: #F6F6F4">            bundle </span><span style="color: #97E1F1">exec</span><span style="color: #F6F6F4"> rails db</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">create</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">universal</span></span>
<span class="line"><span style="color: #F6F6F4">            bundle </span><span style="color: #97E1F1">exec</span><span style="color: #F6F6F4"> rails db</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">schema</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">load</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4">universal </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">trace</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Run</span><span style="color: #F6F6F4"> rspec</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">|</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #BF9EEE">TESTFILES</span><span style="color: #F286C4">=</span><span style="color: #F6F6F4">$(circleci tests glob </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">spec/**/*_spec.rb</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">|</span><span style="color: #F6F6F4"> circleci tests split </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">split</span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">by</span><span style="color: #F286C4">=</span><span style="color: #F6F6F4">timings </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">timings</span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">type</span><span style="color: #F286C4">=</span><span style="color: #F6F6F4">classname)</span></span>
<span class="line"><span style="color: #F6F6F4">            echo ${</span><span style="color: #BF9EEE">TESTFILES</span><span style="color: #F6F6F4">}</span></span>
<span class="line"><span style="color: #F6F6F4">            bundle </span><span style="color: #97E1F1">exec</span><span style="color: #F6F6F4"> rspec </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">profile </span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4"> \</span></span>
<span class="line"><span style="color: #F6F6F4">                              </span><span style="color: #F286C4">--</span><span style="color: #97E1F1">format</span><span style="color: #F6F6F4"> progress \</span></span>
<span class="line"><span style="color: #F6F6F4">                              </span><span style="color: #F286C4">--</span><span style="color: #97E1F1">format</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">RspecJunitFormatter</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">out </span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">tmp</span><span style="color: #F286C4">/</span><span style="color: #97E1F1">test</span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">results</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">rspec</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">rspec.xml \</span></span>
<span class="line"><span style="color: #F6F6F4">                              ${</span><span style="color: #BF9EEE">TESTFILES</span><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #7B7F8B"># Collect test data</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #7B7F8B"># See: https://circleci.com/docs/collect-test-data</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #7B7F8B"># See: https://circleci.com/blog/how-to-output-junit-tests-through-circleci-2-0-for-expanded-insights/</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> store_test_results</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          path</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">/tmp/</span><span style="color: #97E1F1">test</span><span style="color: #F286C4">-</span><span style="color: #F6F6F4">results</span><span style="color: #F286C4">/</span><span style="color: #F6F6F4">rspec</span><span style="color: #F286C4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Run</span><span style="color: #F6F6F4"> danger</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> bundle </span><span style="color: #97E1F1">exec</span><span style="color: #F6F6F4"> danger </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">danger_id</span><span style="color: #F286C4">=</span><span style="color: #97E1F1">test</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  lint</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">    working_directory</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">working_directory</span></span>
<span class="line"><span style="color: #F6F6F4">    resource_class</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> small</span></span>
<span class="line"><span style="color: #F6F6F4">    parallelism</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1</span></span>
<span class="line"><span style="color: #F6F6F4">    docker</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">base_image</span></span>
<span class="line"><span style="color: #F6F6F4">    steps</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> attach_workspace</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          at</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">working_directory</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> run</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">Run</span><span style="color: #F6F6F4"> danger</span></span>
<span class="line"><span style="color: #F6F6F4">          command</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> bundle </span><span style="color: #97E1F1">exec</span><span style="color: #F6F6F4"> danger </span><span style="color: #F286C4">--</span><span style="color: #F6F6F4">danger_id</span><span style="color: #F286C4">=</span><span style="color: #F6F6F4">lint</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B"># Invoke jobs via workflows</span></span>
<span class="line"><span style="color: #7B7F8B"># See: https://circleci.com/docs/2.0/configuration-reference/#workflows</span></span>
<span class="line"><span style="color: #F6F6F4">workflows</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">  build_and_test</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">    jobs</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> build</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> test</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          context</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> ctx_renew_api_company</span></span>
<span class="line"><span style="color: #F6F6F4">          requires</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> build</span></span>
<span class="line"><span style="color: #F6F6F4">      </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> lint</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">          context</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> ctx_renew_api_company</span></span>
<span class="line"><span style="color: #F6F6F4">          requires</span><span style="color: #F286C4">:</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> build</span></span>
<span class="line"></span></code></pre></div>



<p><strong>Step 8</strong>: Config Danger. Create <strong>Dangerfile</strong> and paste code below:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Ruby</span><span role="button" tabindex="0" data-code="# frozen_string_literal: true

case ENV.fetch('CIRCLE_JOB', nil)

when 'lint'

  ### for Rubocop ###

  rubocop.lint(force_exclusion: true, inline_comment: true)

  ### for rails_best_practices ###

  # rails_best_practices.lint

  ### for Reek ###

  # reek.lint

  ### for brakeman ###

  brakeman.run('.')

  # Ensure there is a summary for a pr

  failure('Please provide a summary in the Pull Request description') if     github.pr_body.include?('___WRITE_HERE___')

  # Ensure that all prs have an assignee

  failure('This PR does not have any assignees yet.') unless github.pr_json['assignee']

  # Warn really big diffs

  warn('We cannot handle the scale of this PR') if git.lines_of_code &gt; 300

  # Note when a pr cannot be manually merged, which goes away when you can

  warn('This PR cannot be merged yet.', sticky: false) unless github.pr_json['mergeable']

 when 'test'

  ### for SimpleCov ###

  coverage_file = 'coverage/coverage.json'

  simplecov.report(coverage_file, sticky: false)

  simplecov.individual_report(coverage_file, Dir.pwd)

end" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B"># frozen_string_literal: true</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">case</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ENV</span><span style="color: #F6F6F4">.fetch(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">CIRCLE_JOB</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">nil</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">when</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">lint</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">### for Rubocop ###</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  rubocop.lint(force_exclusion</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">, inline_comment</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">### for rails_best_practices ###</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B"># rails_best_practices.lint</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">### for Reek ###</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B"># reek.lint</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">### for brakeman ###</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  brakeman.run(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">.</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B"># Ensure there is a summary for a pr</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  failure(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">Please provide a summary in the Pull Request description</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4">     github.pr_body.include?(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">___WRITE_HERE___</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B"># Ensure that all prs have an assignee</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  failure(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">This PR does not have any assignees yet.</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">unless</span><span style="color: #F6F6F4"> github.pr_json[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">assignee</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B"># Warn really big diffs</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">warn</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">We cannot handle the scale of this PR</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> git.lines_of_code </span><span style="color: #F286C4">&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">300</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B"># Note when a pr cannot be manually merged, which goes away when you can</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #97E1F1">warn</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">This PR cannot be merged yet.</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, sticky</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">unless</span><span style="color: #F6F6F4"> github.pr_json[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">mergeable</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4"> </span><span style="color: #F286C4">when</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">test</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">### for SimpleCov ###</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  coverage_file </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">coverage/coverage.json</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  simplecov.report(coverage_file, sticky</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  simplecov.individual_report(coverage_file, </span><span style="color: #97E1F1; font-style: italic">Dir</span><span style="color: #F6F6F4">.pwd)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">end</span></span></code></pre></div>



<p><strong>Step 9</strong>: Back to CircleCI -&gt; Click <a href="https://app.circleci.com/settings/organization/github/hinodelabo/overview?return-to=https%3A%2F%2Fapp.circleci.com%2Fpipelines%2Fgithub%2Fhinodelabo%2Fqlear-v2-bot"><strong>Organization Settings -&gt; Contexts -&gt; Create Context</strong></a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="541" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-1024x541.png" alt="" class="wp-image-1929" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-1024x541.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-300x158.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-768x406.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-1536x811.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-380x201.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-800x423.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2-1160x613.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.15.01-2.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Step 10</strong>: Enter name <strong>Context</strong> and click <strong>Create Context</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="480" height="337" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.21.17-1.png" alt="" class="wp-image-1930" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.21.17-1.png 480w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.21.17-1-300x211.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.21.17-1-200x140.png 200w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.21.17-1-380x267.png 380w" sizes="auto, (max-width: 480px) 100vw, 480px" /></figure>



<p><strong>Step 11</strong>: Click Context Name created and add environment for project such as <strong>RAILS_MASTER_KEY</strong>, <strong>RAILS_ENV</strong>, <strong>RACK_ENV</strong>, <strong>DANGER_GITHUB_API_TOKEN</strong></p>



<p><img loading="lazy" decoding="async" width="602" height="369" src="https://lh7-us.googleusercontent.com/17QyXLD3bPoW37cSOYqHPLsPm0uKHPu6OeuHKJdiNjW0BYHRYPnPjpcAqA5T76mSrD8TWG-LWkKGXCnG3C4I38vCi4Cd7omWGvVoAaEupr0jK01mlqi-yk3ejp44tmiIINx_DKnS1ZlCYgSS2hvmkA"></p>



<p>Click Add Environment and enter value as below:</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/VawQSbkEyRNPF0gTcuZpOMupCXkMWjkHYUkubeARhEFwjAtprXU7dO_uB1kJj_arFhyvmuBcOROKFznmQ20Z17xrc4TPQYJAtPGN9vP8u6IuuAJtv8jbnzBHktucj95hNV1ngdzhq6uqiyO7CVnMpA" alt=""/></figure>



<p><strong>Note:</strong></p>



<ul class="wp-block-list">
<li>RAILS_MASTER_KEY: Open file config/crendentials/test.key on project and copy it.</li>



<li>RAILS_ENV: test</li>



<li>RACK_ENV: test</li>
</ul>



<p>After add 3 environments, it will displayed as below:</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/WiT33geUhW0yOKFsk__sCQAGncXWsmc2gYABWVxVpEFs1loyoiC2nswh9C3YwTovzG9umpGJqqHC_uIf455XlXv5T8LRER2VQKr6JSDhRT4TeAmHii1cJrkZ2MrPnwm6FjBB_DzUdZC3i3QzuqpMsw" alt=""/></figure>



<p><strong>Step 12</strong>: Create <strong>DANGER_GITHUB_API_TOKEN</strong></p>



<ol class="wp-block-list">
<li>Access <a href="https://github.com/settings/tokens">https://github.com/settings/tokens</a> and click <strong>Generate new token</strong></li>
</ol>



<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/G8nn12MjFXdAlmZPbLyXC9j_FDpA4Mg1ES-R79AqjJo6rwp-QqaIWbWbwgWo678Jx2qUMSY8DqvkQehGEYDwLeR5eLddtBcirZmUMXvGYOSuMHqEi35NP7Da1p0TYW-dn0UBHUmod9FEVhM8qlCoAw" alt=""/></figure>



<ol class="wp-block-list" start="2">
<li>Write Note and Select Expiration, Scope. I choose Expiration 90 days and click repo</li>
</ol>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="776" height="388" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.43.20-1.png" alt="" class="wp-image-1934" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.43.20-1.png 776w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.43.20-1-300x150.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.43.20-1-768x384.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.43.20-1-380x190.png 380w" sizes="auto, (max-width: 776px) 100vw, 776px" /></figure>



<ol class="wp-block-list" start="3">
<li>Click Generate Token and Copy this.</li>
</ol>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="379" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.44.39-1.png" alt="" class="wp-image-1931" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.44.39-1.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.44.39-1-300x142.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.44.39-1-768x364.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-13.44.39-1-380x180.png 380w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<ol class="wp-block-list" start="4">
<li>Back to <strong>Context</strong> and Add <strong>DANGER_GITHUB_API_TOKEN</strong></li>
</ol>



<p><strong>Step 12</strong>: Push code and runnnnn</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="287" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-1024x287.png" alt="" class="wp-image-1933" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-1024x287.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-300x84.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-768x216.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-1536x431.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-380x107.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-800x225.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1-1160x326.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.09-1.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="931" height="497" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.43.png" alt="" class="wp-image-1936" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.43.png 931w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.43-300x160.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.43-768x410.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.43-380x203.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/Screen-Shot-2023-07-18-at-14.23.43-800x427.png 800w" sizes="auto, (max-width: 931px) 100vw, 931px" /></figure>
<p>The post <a href="https://blog.tomosia.com.vn/ror-huong-dan-setup-circleci-code-quality/">[ROR] Hướng dẫn setup CircleCI &#038; Code Quality</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/ror-huong-dan-setup-circleci-code-quality/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Trình tự thực thi SQL</title>
		<link>https://blog.tomosia.com.vn/trinh-tu-thuc-thi-sql/</link>
					<comments>https://blog.tomosia.com.vn/trinh-tu-thuc-thi-sql/#comments</comments>
		
		<dc:creator><![CDATA[Thuan Nguyen Van]]></dc:creator>
		<pubDate>Mon, 20 Nov 2023 06:24:52 +0000</pubDate>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Sql]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1917</guid>

					<description><![CDATA[<p>Việc truy vấn SQL là công việc mà hầu như mọi lập trình viên Backend chúng ta đều&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/trinh-tu-thuc-thi-sql/">Trình tự thực thi SQL</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Việc truy vấn SQL là công việc mà hầu như mọi lập trình viên Backend chúng ta đều tiếp xúc hằng ngày. Trong một câu truy vấn SQL bao gồm nhiều mệnh đề như SELECT, FROM, WHERE, GROUPBY, HAVING, and ORDERBY. Trong bài viết này chúng ta cùng tìm hiểu về thứ tự của một câu truy vấn SQL. </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="861" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/11/image-22.png" alt="" class="wp-image-1918" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/11/image-22.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/image-22-279x300.png 279w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/image-22-768x827.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/11/image-22-380x409.png 380w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p></p>



<p>Theo hình ở trên, thứ tự truy vấn được thực hiện theo thứ tự:</p>



<figure class="wp-block-table"><table><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Clause&nbsp;</strong></td><td><strong>Function</strong></td></tr><tr><td class="has-text-align-left" data-align="left"><strong>FROM /&nbsp;<a href="https://www.shiksha.com/online-courses/articles/sql-joins/" target="_blank" rel="noreferrer noopener">JOIN</a></strong></td><td>Khi bạn viết bất kỳ truy vấn nào, SQL sẽ bắt đầu bằng cách xác định các bảng để truy xuất dữ liệu và cách chúng được kết nối.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong><a href="https://www.shiksha.com/online-courses/articles/how-to-use-where-clause-in-sql/" target="_blank" rel="noreferrer noopener">WHERE</a></strong></td><td>Nó hoạt động như một filters; nó lọc bản ghi dựa trên các điều kiện do người dùng chỉ định.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong><a href="https://www.shiksha.com/online-courses/articles/how-to-use-group-by-in-sql/" target="_blank" rel="noreferrer noopener">GROUP BY</a></strong></td><td>Dữ liệu đã lọc được nhóm lại dựa trên điều kiện đã chỉ định.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong><a href="https://www.shiksha.com/online-courses/articles/how-to-use-having-clause-in-sql/" target="_blank" rel="noreferrer noopener">HAVING</a></strong></td><td>Nó tương tự như mệnh đề WHERE nhưng được áp dụng sau khi nhóm dữ liệu.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong><a href="https://www.shiksha.com/online-courses/articles/select-statement-in-sql/" target="_blank" rel="noreferrer noopener">SELECT</a></strong></td><td>Mệnh đề chọn các cột để đưa vào kết quả cuối cùng.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong><a href="https://www.shiksha.com/online-courses/articles/how-to-use-distinct-in-sql/" target="_blank" rel="noreferrer noopener">DISTINCT</a></strong></td><td>Loại bỏ các hàng trùng lặp khỏi kết quả. Khi bạn áp dụng điều khoản này, bạn chỉ còn lại các bản ghi riêng biệt.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong><a href="https://www.shiksha.com/online-courses/articles/how-to-use-order-by-clause-in-sql/" target="_blank" rel="noreferrer noopener">ORDER BY</a></strong></td><td>Nó sắp xếp (tăng/giảm/A-&gt;Z/Z-&gt;A) kết quả dựa trên điều kiện đã chỉ định.</td></tr><tr><td class="has-text-align-left" data-align="left"><strong><a href="https://www.shiksha.com/online-courses/articles/how-to-use-limit-clause-in-sql/" target="_blank" rel="noreferrer noopener">LIMIT</a>&nbsp;/ OFFSET</strong></td><td>Nó xác định số lượng bản ghi cần trả về và bắt đầu từ đâu.</td></tr></tbody></table></figure>



<p>Tham khảo: <a href="https://www.linkedin.com/posts/nikkisiapno_want-to-know-the-secret-to-optimizing-your-activity-7122893424134934529-Y9U7?utm_source=share&amp;utm_medium=member_desktop">https://www.linkedin.com/posts/nikkisiapno_want-to-know-the-secret-to-optimizing-your-activity-7122893424134934529-Y9U7?utm_source=share&amp;utm_medium=member_desktop</a></p>
<p>The post <a href="https://blog.tomosia.com.vn/trinh-tu-thuc-thi-sql/">Trình tự thực thi SQL</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/trinh-tu-thuc-thi-sql/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Length, Size, and Count in Ruby and Rails: Khi nào nên sử dụng chúng?</title>
		<link>https://blog.tomosia.com.vn/length-size-and-count-in-ruby-and-rails-khi-nao-nen-su-dung-chung/</link>
					<comments>https://blog.tomosia.com.vn/length-size-and-count-in-ruby-and-rails-khi-nao-nen-su-dung-chung/#comments</comments>
		
		<dc:creator><![CDATA[Thuan Nguyen Van]]></dc:creator>
		<pubDate>Thu, 19 Oct 2023 01:39:02 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Rails]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1353</guid>

					<description><![CDATA[<p>Tương tự Ruby thì trong Rails cung cấp cho chúng ta nhiều cách để làm một hành động&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/length-size-and-count-in-ruby-and-rails-khi-nao-nen-su-dung-chung/">Length, Size, and Count in Ruby and Rails: Khi nào nên sử dụng chúng?</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Tương tự Ruby thì trong Rails cung cấp cho chúng ta nhiều cách để làm một hành động tương tự nhau. Ví dụ rõ ràng nhất là bài toán <strong>tìm số phần tử trong một Collection</strong>. Bạn có thể sử dụng các method <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">length</mark>, <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">size</mark> và <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">count</mark> để thực hiện việc này.</p>



<p>Tuy nhiên, bạn cảm thấy khó hiểu vì sao lại có tận 3 method và chúng khác nhau như thế nào? Khi nào nên sử dụng chúng hoặc lựa chọn chúng có ảnh hưởng đến <strong>performance</strong> của dự án hay không? Bài đăng này sẽ khám phá sự khác biệt của chúng.</p>



<p>Hãy bắt đầu với cái nhìn tổng quan về các phương thức này trong Array của Ruby. Sau đó chúng ta sẽ chuyển sang Rails.</p>



<h2 id="ruby" class="wp-block-heading">Ruby</h2>



<h3 id="1-length" class="wp-block-heading">1. Length</h3>



<p>Đây là phương thức đơn giản nhất và thân thuộc nhất trong 3 loại. Bạn có thể thấy chúng trong bất kì dự án nào bạn làm.<br><br>Method <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">length</mark> nó trả về số lượng phần tử trong một mảng.</p>



<p>Cú pháp rất đơn giản phải không nào?</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="numbers = [1,2,3,4,5,6]

numbers.length # =&gt; 6" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">numbers </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">numbers.length </span><span style="color: #6272A4"># =&gt; 6</span></span></code></pre></div>



<h3 id="2-size" class="wp-block-heading">2. Size</h3>



<p>Size thực chất là alias của <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">length</mark>. Cách nó thực thi giống như <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">length</mark> vậy.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="rubynumbers = [1,2,3,4,5,6]

numbers.size # =&gt; 6" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">rubynumbers </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> [</span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">4</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">,</span><span style="color: #BD93F9">6</span><span style="color: #F8F8F2">]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">numbers.size </span><span style="color: #6272A4"># =&gt; 6</span></span></code></pre></div>



<p>Vậy thì khi nào sẽ sử dụng <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">length</mark> và <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">size</mark>? Đó là sử dụng tuỳ theo ngữ cảnh mà bạn đang gặp phải.<br><br>Ví dụ: Nếu tôi có một mảng <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">class_room</mark> chứa một nhóm các học sinh, tôi sẽ sử dụng <strong>class_room.size</strong> thay vì <strong>class_room.length</strong>. Mặc khác, nếu tôi sử lý một mảng các numbers, tôi sẽ sử dụng method <code>length</code>.</p>



<h3 id="3-count" class="wp-block-heading">3. Count</h3>



<p>Phương thức này thường được sử dụng để đếm số phần tử được chỉ định trong Array. Sử dụng chúng khi bạn cần tìm một phần tử phù hợp với một tiêu chí nào đó. Có 4 trường hợp sử dụng phương pháp này.<br><br><strong>3.1</strong> <strong>Nếu như không có argument và không có block, trả về số lượng tất cả các phần tử</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="[10, 20, 30].count # =&gt; 3

[].count # =&gt; 0" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">[</span><span style="color: #BD93F9">10</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">20</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">30</span><span style="color: #F8F8F2">].count </span><span style="color: #6272A4"># =&gt; 3</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">[].count </span><span style="color: #6272A4"># =&gt; 0</span></span></code></pre></div>



<p><br><strong>3.2</strong> <strong>Khi có argument, trả về argument được cung cấp</strong><br></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="[0, 5, 10, 0.0].count(0) # =&gt; 2

[0, 1, 2].count(3) # =&gt; 0" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">[</span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">10</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">0.0</span><span style="color: #F8F8F2">].count(</span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">) </span><span style="color: #6272A4"># =&gt; 2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">[</span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">].count(</span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">) </span><span style="color: #6272A4"># =&gt; 0</span></span></code></pre></div>



<p><br><strong>3.3</strong> <strong>Khi có block nhưng lại không có argument</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="[0, 5, 10, 15].count { |e| e &gt; 5 } # =&gt; 2" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">[</span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">10</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">15</span><span style="color: #F8F8F2">].count { |e| e </span><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">5</span><span style="color: #F8F8F2"> } </span><span style="color: #6272A4"># =&gt; 2</span></span></code></pre></div>



<p><br><strong>3.4</strong> <strong>Nếu vừa có cả block và argument, nó bỏ qua block và trả về các đối số thoả điều kiện</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="[0, 1, 2, 3].count(2) { |e| e = 0 } # =&gt; 1" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">[</span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">1</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">, </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2">].count(</span><span style="color: #BD93F9">2</span><span style="color: #F8F8F2">) { |e| e </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">0</span><span style="color: #F8F8F2"> } </span><span style="color: #6272A4"># =&gt; 1</span></span></code></pre></div>



<p>Nhưng phương thức này sẽ trả ra một WARNING như bên dưới:</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="379" height="60" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.09.48.png" alt="" class="wp-image-1371" style="aspect-ratio:6.316666666666666;width:679px;height:auto" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.09.48.png 379w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.09.48-300x47.png 300w" sizes="auto, (max-width: 379px) 100vw, 379px" /></figure>



<h2 id="ruby-on-rails" class="wp-block-heading">Ruby On Rails</h2>



<p>Chúng ta sẽ lấy ví dụ từ lớp <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">ActiveRecord::Associations::CollectionProxy</mark> được kế thừa từ lớp  <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">ActiveRecord::Relation</mark>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="class Company &lt; ActiveRecord::Base
  has_many :company_members
end

company = Company.first
company_members = company.company_members

# CompanyMember::ActiveRecord_Associations_CollectionProxy
company_members.class " style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">class</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD">Company</span><span style="color: #F8F8F2"> </span><span style="color: #FF79C6">&lt;</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">ActiveRecord::Base</span></span>
<span class="line"><span style="color: #F8F8F2">  has_many </span><span style="color: #BD93F9">:company_members</span></span>
<span class="line"><span style="color: #FF79C6">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F8F8F2">company </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Company</span><span style="color: #F8F8F2">.first</span></span>
<span class="line"><span style="color: #F8F8F2">company_members </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> company.company_members</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># CompanyMember::ActiveRecord_Associations_CollectionProxy</span></span>
<span class="line"><span style="color: #F8F8F2">company_members.class </span></span></code></pre></div>



<p>Ở ví dụ trên, <strong>comments</strong> là một <strong>Collection Proxy</strong>, bây giờ hãy tìm hiểu cách các phương thức này hoạt động trên <strong>Collection Proxy</strong>.</p>



<h3 id="1-size" class="wp-block-heading">1. Size</h3>



<p>Nếu collection chưa được query, thì phương thức <strong>size</strong> sẽ thực thi câu lệnh <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-cyan-blue-color">SELECT COUNT(*)</mark>. Ngược lại thì chúng sẽ gọi <strong>collection.size</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="Company.all.size
# SELECT &quot;companies&quot;.* FROM &quot;companies&quot;" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #8BE9FD; font-style: italic">Company</span><span style="color: #F8F8F2">.all.size</span></span>
<span class="line"><span style="color: #6272A4"># SELECT &quot;companies&quot;.* FROM &quot;companies&quot;</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="701" height="398" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-55.png" alt="" class="wp-image-1373" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-55.png 701w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-55-300x170.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-55-380x216.png 380w" sizes="auto, (max-width: 701px) 100vw, 701px" /></figure>



<h3 id="2-length" class="wp-block-heading">2. Length</h3>



<p>Trả về size cua <strong>Collection</strong> bằng cách call method <strong>size</strong>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="Company.all.length
# SELECT &quot;companies&quot;.* FROM &quot;companies&quot;" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #8BE9FD; font-style: italic">Company</span><span style="color: #F8F8F2">.all.length</span></span>
<span class="line"><span style="color: #6272A4"># SELECT &quot;companies&quot;.* FROM &quot;companies&quot;</span></span></code></pre></div>



<p>Điều đó có nghĩa thì nếu <strong>collection</strong> đã được loaded thì method <strong>size</strong> và <strong>length</strong> tương đương nhau</p>



<p class="has-medium-font-size"><strong>Vậy khi nào nên dùng <code>size</code> vs <code>length</code>?</strong></p>



<p>Khi Collection đã được loaded thì method size và length đều như nhau.</p>



<p>Còn nếu collection không được load từ database:</p>



<ul class="wp-block-list">
<li>Nếu bạn cần vẫn cần records bất cứ lúc nào thì hãy sử dụng method <strong>length</strong>. Điều này sẽ giảm đi một truy vấn, vì Rails sẽ sử dụng các bản ghi được lưu trong bộ nhớ cache cho truy vấn sau đó.</li>



<li>Nếu bạn không cần records thì sử dụng method <strong>size</strong> sẽ hiệu quả hơn. Method này sẽ thực hiện một truy vấn COUNT SQL để lấy số lượng trực tiếp từ cơ sở dữ liệu, mà không cần tải các bản ghi vào bộ nhớ.</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="127" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05-1024x127.png" alt="" class="wp-image-1380" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05-1024x127.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05-300x37.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05-768x95.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05-380x47.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05-800x99.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05-1160x144.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-22.51.05.png 1336w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="3-count-2" class="wp-block-heading">3. Count</h3>



<p>Tương tự như method <strong>count</strong> của Ruby, method <strong>count</strong> trong Rails đếm tất cả các bản ghi trong một tập hợp thỏa mãn một điều kiện cho trước. Có 2 trường hợp sử dụng:</p>



<ul class="wp-block-list">
<li>Khi không có block, trả về số lượng tất cả records trong table</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="companies = Company.all

# SELECT COUNT(*) FROM &quot;companies&quot;
companies.count" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F8F8F2">companies </span><span style="color: #FF79C6">=</span><span style="color: #F8F8F2"> </span><span style="color: #8BE9FD; font-style: italic">Company</span><span style="color: #F8F8F2">.all</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6272A4"># SELECT COUNT(*) FROM &quot;companies&quot;</span></span>
<span class="line"><span style="color: #F8F8F2">companies.count</span></span></code></pre></div>



<ul class="wp-block-list">
<li>Khi có block, method <strong>count</strong> trong Rails gọi <strong>block</strong> với mỗi phần tử trong tập hợp và trả về số lượng phần tử mà khối trả về giá trị đúng (truthy).</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#F8F8F2;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#efefe1">Ruby</span><span role="button" tabindex="0" data-code="Company.all.count { |company| company.charge_firstname.include?('Be') }" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #8BE9FD; font-style: italic">Company</span><span style="color: #F8F8F2">.all.count { |company| company.charge_firstname.include?(</span><span style="color: #E9F284">&#39;</span><span style="color: #F1FA8C">Be</span><span style="color: #E9F284">&#39;</span><span style="color: #F8F8F2">) }</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="844" height="61" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-23.06.06.png" alt="" class="wp-image-1381" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-23.06.06.png 844w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-23.06.06-300x22.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-23.06.06-768x56.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-23.06.06-380x27.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/Screen-Shot-2023-10-18-at-23.06.06-800x58.png 800w" sizes="auto, (max-width: 844px) 100vw, 844px" /></figure>



<h2 id="ket" class="wp-block-heading">KẾT</h2>



<p>Hy vọng rằng bạn đã thấy bài viết này hữu ích và bạn đã học được điều gì đó mới. 😀</p>
<p>The post <a href="https://blog.tomosia.com.vn/length-size-and-count-in-ruby-and-rails-khi-nao-nen-su-dung-chung/">Length, Size, and Count in Ruby and Rails: Khi nào nên sử dụng chúng?</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/length-size-and-count-in-ruby-and-rails-khi-nao-nen-su-dung-chung/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
	</channel>
</rss>
