1"use strict";(self.webpackChunkgatsby_starter_default=self.webpackChunkgatsby_starter_default||[]).push([[1910],{64005:function(e,n,t){t.r(n),t.d(n,{Head:function(){return b},default:function(){return _}});var a=t(28453),s=t(96540);function l(e){const n=Object.assign({p:"p",span:"span",ul:"ul",li:"li",strong:"strong",h2:"h2",a:"a"},(0,a.R)(),e.components);return s.createElement(s.Fragment,null,s.createElement(n.p,null,"In Ruby on Rails,\nthe ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment_counter</code>'}})," and ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">decrement_counter</code>'}}),"\nare functionalities offered by ActiveRecord.\nThese functions are utilized to increment or decrement the value within a designated column within a database table,\nspecifically targeting a particular record.\nThey prove handy for updating counts or statistical data associated with a record,\nall while bypassing the necessity to fetch and store the complete record."),"\n",s.createElement(n.p,null,"The basic syntax of the ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment_counter</code>'}})," method is as follows:"),"\n",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby">Model<span class="token punctuation">.</span>increment_counter<span class="token punctuation">(</span><span class="token symbol">:column_name</span><span class="token punctuation">,</span> id<span class="token punctuation">)</span></code></pre></div>'}}),"\n",s.createElement(n.ul,null,"\n",s.createElement(n.li,null,s.createElement(n.strong,null,"Model:")," The name of the ActiveRecord model representing the database table."),"\n",s.createElement(n.li,null,s.createElement(n.strong,null,":column_name:")," The name of the column you want to increment."),"\n",s.createElement(n.li,null,s.createElement(n.strong,null,"id:")," The ID of the specific record you want to increment the counter."),"\n"),"\n",s.createElement(n.p,null,"The ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment_counter</code>'}})," method will increase the column value\nby 1 each time it gets executed."),"\n",s.createElement(n.h2,{id:"before-rails-71",style:{position:"relative"}},s.createElement(n.a,{href:"#before-rails-71","aria-label":"before rails 71 permalink",className:"anchor before"},s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Before Rails 7.1"),"\n",s.createElement(n.p,null,"The ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment_counter</code>'}}),"\nand\n",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">decrement_counter</code>'}})," methods are used primarily to maintain\n",s.createElement(n.a,{href:"https://api.rubyonrails.org/classes/ActiveRecord/CounterCache/ClassMethods.html"},"counter cache"),"\ncolumns that store aggregate values."),"\n",s.createElement(n.p,null,"For example,\nif you have a ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">Company</code>'}})," model with a column named ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">employees_count</code>'}}),"\nand\nyou want to increment the view count of a specific company\nwith an ID of 1,\nyou would use:"),"\n",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby">Company<span class="token punctuation">.</span>
1increment_counter<span class="token punctuation">(</span><span class="token symbol">:employees_count</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span></code></pre></div>'}}),"\n",s.createElement(n.p,null,"This would generate an SQL query that updates the ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">employees_count</code>'}})," column\nof the ",s.createElement(n.strong,null,"companies")," table for the record with an ID of 1.\nThe ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment_counter</code>'}})," operates at the database level,\nso it doesn't retrieve the actual record from the database.\nThis can be more efficient than loading the entire record,\nincrementing the counter,\nand\nthen saving it back to the database."),"\n",s.createElement(n.p,null,"But there are a few cases where you might want to increase the value\nof ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">employees_count</code>'}})," by N, where N is greater than 1."),"\n",s.createElement(n.p,null,"Before Rails 7.1,\nthe possible ways were"),"\n",s.createElement(n.ul,null,"\n",s.createElement(n.li,null,"Call the ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment_counter</code>'}})," N times"),"\n"),"\n",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby"><span class="token constant">N</span><span class="token punctuation">.</span>times <span class="token keyword">do</span>\n Company<span class="token punctuation">.</span>increment_counter<span class="token punctuation">(</span><span class="token symbol">:employees_count</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>\n<span class="token keyword">end</span></code></pre></div>'}}),"\n",s.createElement(n.ul,null,"\n",s.createElement(n.li,null,"Call the ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">update_all</code>'}})," query"),"\n"),"\n",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby">Company<span class="token punctuation">.</span>where<span class="token punctuation">(</span><span class="token symbol">id</span><span class="token operator">:</span> id<span class="token punctuation">)</span><span class="token punctuation">.</span>update_all<span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"employees_count = employees_count + 5"</span></span><span class="token punctuation">)</span></code></pre></div>'}}),"\n",s.createElement(n.p,null,"This approach is less convenient than ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment_counter</code>'}}),".\nThe increment_counter function automatically manages the usage of\n",s.createElement(n.a,{href:"https://learn.microsoft.com/en-us/sql/t-sql/language-elements/coalesce-transact-sql"},"COALESCE"),"\nand effectively addresses challenges related to concurrency."),"\n",s.createElement(n.ul,null,"\n",s.createElement(n.li,null,"Call ",s.createElement(n.a,{href:"https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-increment"},"ActiveRecord::Persistence#increment")," on the company record"),"\n"),"\n",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby">company <span class="token operator">=</span> Company<span class="token punctuation">.</span>find<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>\n\ncompany<span class="token punctuation">.</span>increment<span class="token punctuation">(</span><span class="token symbol">:employees_count</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span></code></pre></div>'}}),"\n",s.createElement(n.p,null,"The ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">increment</code>'}})," method modifies the ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">employees_count</code>'}})," within the memory\nand\nsubsequently writes this modified value to the database.\nHowever,\nthis approach could overwrite a recently updated value due to race conditions."),"\n",s.createElement(n.h2,{id:"in-rails-71",style:{position:"relative"}}
1,s.createElement(n.a,{href:"#in-rails-71","aria-label":"in rails 71 permalink",className:"anchor before"},s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"In Rails 7.1"),"\n",s.createElement(n.p,null,s.createElement(n.a,{href:"https://github.com/rails/rails/pull/48128"},"Rails 7.1 makes increment_counter\nand\ndecrement_counter accept\na 'by' argument"),"."),"\n",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby">Company<span class="token punctuation">.</span>increment_counter<span class="token punctuation">(</span><span class="token symbol">:employees_count</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token symbol">by</span><span class="token operator">:</span> <span class="token number">5</span><span class="token punctuation">)</span></code></pre></div>'}}),"\n",s.createElement(n.p,null,"This modification will also align with the current increment methods within Rails.\nThese existing methods,\nsuch as ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">ActiveRecord::Persistence#increment</code>'}})," and ",s.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">ActiveSupport::CacheStore#increment</code>'}}),",\nalready incorporate the usage of a 'by' argument and an 'amount' argument,\nrespectively."),"\n",s.createElement(n.p,null,"To know more about this feature,\nplease refer to this\n",s.createElement(n.a,{href:"https://github.com/rails/rails/pull/48128"},"PR"),"."))}var c=function(e){void 0===e&&(e={});const{wrapper:n}=Object.assign({},(0,a.R)(),e.components);return n?s.createElement(n,e,s.createElement(l,e)):l(e)},r=t(5588),o=t(65427),u=t(20504),i=t(43397),p=t(61942);const m=e=>e.replace(/\/+$/,""),d=(e,n)=>n?""+e+(n.startsWith("/")?n:"/"+n):e,h=(e,n)=>d(m(e),n),g=(e,n)=>d((e=>"undefined"!=typeof window?window.location.origin:m(e))(e),n),y=(e,n)=>{const t=(0,r.d)(n);return t?h(e,t):(e=>h(e,"/shakacode-og.png"))(e)},E=e=>{let{data:n,location:t,children:a}=e;const{frontmatter:l}=n.mdx,{siteUrl:c}=n.site.siteMetadata,r=g(c,t.pathname);return s.createElement(s.Fragment,null,s.createElement(o.A,null),s.createElement(u.A,{header:s.createElement(p.r,{breadcrumb:l.title}),main:s.createElement(s.Fragment,null,s.createElement(p.c,{body:a,title:l.title,author:l.author,date:l.date,link:r,categories:l.categories,featuredImage:l.featuredImage,showFeaturedImage:l.showFeaturedImage}),s.createElement(i.LN,null))}))};function _(e){return s.createElement(E,e,s.createElement(c,e))}const b=e=>{let{data:n,location:t}=e;const{frontmatter:a,excerpt:l}=n.mdx,{siteMetadata:c}=n.site,{siteUrl:r,title:o,description:u}=c,i=((e,n,t)=>e.excerpt||n||t)(a,l,u),p=y(r,a.featuredImage),m=h(r,t.pathname);return s.createElement(s.Fragment,null,s.createElement("title",null,a.title+" | "+o),s.createElement("link",{rel:"canonical",href:m}),s.createElement("meta",{name:"description",content:i}),s.createElement("meta",{property:"og:title",content:a.title}),s.createElement("meta",{property:"og:description",content:i}),s.createElement("meta",{property:"og:type",content:"article"}),s.createElement("meta",{property:"og:url",content:m}),s.createElement("meta",{property:"og:image",content:p}),s.createElement("meta",{name:"image",content:p}),s.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),s.createElement("meta",{name:"twitter:title",content:a.title}),s.createElement("meta",{name:"twitter:description",content:i}),s.createElement("meta",{name:"twitter:image",content:p}))}}}]); 2//# sourceMappingURL=component---src-template-blog-article-tsx-content-file-path-src-posts-rails-7-1-increment-decrement-counter-accepts-a-by-argument-index-mdx-1f13bf8b8d9a6adc53e6.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.