1. Introduction to the problem:
- When working on a project, all data will be processed through the model and saved in the DB, such as user information, products, invoices ….
- However, there are also some data that act as the master data of the system and do not need to be stored in the DB but still need to be processed through the model, for example 12 grade blocks, alphabets, etc.
- Today I will introduce some ways that I have dealt with the above problem.
2. Tabless Actice Record Model:
- I will create the Letter class and implement the necessary functions as a real model123456789101112131415161718192021222324252627<span class="token comment"># app/models/letter.rb</span><span class="token keyword">class</span> <span class="token class-name">Letter</span><span class="token keyword">class</span> <span class="token operator"><</span> <span class="token operator"><</span> <span class="token keyword">self</span><span class="token keyword">def</span> all<span class="token punctuation">(</span> <span class="token string">"a"</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token string">"z"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> map <span class="token punctuation">{</span> <span class="token operator">|</span> char <span class="token operator">|</span> <span class="token constant">Letter</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> char <span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token keyword">end</span><span class="token keyword">def</span> find_by paramsall <span class="token punctuation">.</span> detect <span class="token punctuation">{</span> <span class="token operator">|</span> letter <span class="token operator">|</span> letter <span class="token punctuation">.</span> char <span class="token operator">==</span> params <span class="token punctuation">[</span> <span class="token symbol">:char</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token keyword">end</span><span class="token keyword">end</span>attr_reader <span class="token symbol">:char</span><span class="token keyword">def</span> initialize char<span class="token variable">@char</span> <span class="token operator">=</span> char<span class="token keyword">end</span><span class="token keyword">def</span> to_paramschar<span class="token keyword">end</span><span class="token keyword">def</span> products<span class="token constant">Product</span> <span class="token punctuation">.</span> <span class="token function">where</span> <span class="token punctuation">(</span> <span class="token string">"name LIKE ?"</span> <span class="token punctuation">,</span> <span class="token string">" <span class="token interpolation"><span class="token delimiter tag">#{</span> char <span class="token delimiter tag">}</span></span> %"</span> <span class="token punctuation">)</span><span class="token keyword">end</span><span class="token keyword">end</span>
- Here I have implemented some functions so
Letter
can be used asActiveRecord
of Rails.123456<span class="token constant">Letter</span> <span class="token punctuation">.</span> all<span class="token constant">Letter</span> <span class="token punctuation">.</span> <span class="token function">find_by</span> <span class="token punctuation">(</span> char <span class="token punctuation">:</span> <span class="token string">"a"</span> <span class="token punctuation">)</span><span class="token constant">Letter</span> <span class="token punctuation">.</span> <span class="token function">find_by</span> <span class="token punctuation">(</span> char <span class="token punctuation">:</span> <span class="token string">""</span> <span class="token punctuation">)</span>letter <span class="token operator">=</span> <span class="token constant">Letter</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token string">"a"</span> <span class="token punctuation">)</span>letter <span class="token punctuation">.</span> products - Can you continue implementing other methods like
Letter.first
,Letter.last
,letter.valid?
, …. - You can also create LettersController for Letter as normal model1234567891011121314151617181920212223<span class="token comment"># app/controllers/letters_controller.rb</span><span class="token keyword">class</span> <span class="token class-name">LettersController</span> <span class="token operator"><</span> <span class="token constant">ApplicationController</span>before_action <span class="token symbol">:load_letter</span> <span class="token punctuation">,</span> only <span class="token punctuation">:</span> <span class="token symbol">:show</span><span class="token keyword">def</span> index<span class="token variable">@letters</span> <span class="token operator">=</span> <span class="token constant">Letter</span> <span class="token punctuation">.</span> all<span class="token keyword">end</span><span class="token keyword">def</span> show<span class="token variable">@letters</span> <span class="token operator">=</span> <span class="token constant">Letter</span> <span class="token punctuation">.</span> all<span class="token variable">@products</span> <span class="token operator">=</span> <span class="token variable">@letter</span> <span class="token punctuation">.</span> products<span class="token keyword">end</span><span class="token keyword">private</span><span class="token keyword">def</span> load_letter<span class="token variable">@letter</span> <span class="token operator">=</span> <span class="token constant">Letter</span> <span class="token punctuation">.</span> find_by char <span class="token punctuation">:</span> params <span class="token punctuation">[</span> <span class="token symbol">:id</span> <span class="token punctuation">]</span><span class="token keyword">return</span> <span class="token keyword">if</span> <span class="token variable">@letter</span>flash <span class="token punctuation">[</span> <span class="token symbol">:danger</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Letter not found"</span>redirect_to root_path<span class="token keyword">end</span><span class="token keyword">end</span>1234567891011<span class="token comment"># app/views/letters/index.html.erb</span><span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"container"</span> <span class="token operator">></span><span class="token operator"><</span> h3 <span class="token operator">></span> <span class="token constant">Letter</span> <span class="token constant">List</span> <span class="token operator"><</span> <span class="token operator">/</span> h3 <span class="token operator">></span><span class="token operator"><</span> ul <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"pager"</span> <span class="token operator">></span><span class="token operator"><</span> <span class="token operator">%</span> <span class="token variable">@letters</span> <span class="token punctuation">.</span> <span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span> letter <span class="token operator">|</span> <span class="token string">%><li></span> <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> link_to letter <span class="token punctuation">.</span> char <span class="token punctuation">.</span> upcase <span class="token punctuation">,</span> <span class="token function">letter_path</span> <span class="token punctuation">(</span> id <span class="token punctuation">:</span> letter <span class="token punctuation">.</span> char <span class="token punctuation">)</span> <span class="token string">%></li></span><span class="token operator"><</span> <span class="token operator">%</span> <span class="token keyword">end</span> <span class="token string">%></ul></span><span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span>123<span class="token comment"># app/views/letters/show.html.erb</span><span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"container"</span> <span class="token operator">></span><span class="token operator"><</span> h3 <span class="token operator">></span> <span class="token constant">Product</span> <span class="token constant">List</span> <span class="token operator"><</span> <span class="token operator">/</span> h3 <span class="token operator">></span>
< ul class = “pager” >
< % @letters . each do | letter | %>
<li> < %= link_to letter.char.upcase, letter_path(id: letter.char), class: (“active” if params12