1. Giới thiệu bài toán:
- Khi làm dự án tất cả các dữ liệu sẽ được xử lý thông qua model và lưu vào trong DB, ví dụ thông tin user, sản phẩm, hoá đơn ….
- Tuy nhiên cũng có 1 số dữ liệu đóng vai trò như master data của hệ thống và không cần lưu vào trong DB nhưng vẫn có nhu cầu được xử lý thông qua model, ví dụ 12 khối lớp, bảng chữ cái, ….
- Hôm nay mình sẽ giới thiệu 1 số cách mà mình đã xử lý bài toán trên.
2. Tabless Actice Record Model:
Mình sẽ tạo class Letter và implement các hàm cần thiết như 1 model thật sự
123456789101112131415161718192021222324252627<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>Ở đây mình đã implement 1 số hàm để
Letter
có thể được sử dụng nhưActiveRecord
của 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>productsBạn có thể tiếp tục implement thêm các methods khác như
Letter.first
,Letter.last
,letter.valid?
, ….Bạn cũng có thể tạo LettersController cho Letter như model bình thường
1234567891011121314151617181920212223<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># app/views/letters/show.html.erb
<div class="container">
<h3>Product List</h3><ul class="pager">
<% @letters.each do |letter| %>
<li><%= link_to letter.char.upcase, letter_path(id: letter.char), class: ("active" if paramsNguồn bài viết : Viblo