12/08/2018, 16:33

Một vài tip nhỏ Ruby on Rails có thể bạn chưa biết

1. Hash#dig Phương thức này được giới thiệu từ 2.3 Chúng ta hãy nhìn ví dụ dưới đây nhé . . . if params [ :user ] && params [ :user ] [ :address ] && params [ :user ] [ :address ] [ :somewhere_deep ] Nhìn vào đoạn code trên chúng ta nghĩa đến ngay ...

1. Hash#dig

Phương thức này được giới thiệu từ 2.3 Chúng ta hãy nhìn ví dụ dưới đây nhé

... if params[:user] && params[:user][:address] && params[:user][:address][:somewhere_deep]

Nhìn vào đoạn code trên chúng ta nghĩa đến ngay 1 toán tử giúp kiểm tra nil là &. Nhưng đối với các object Hash chúng ta có thể dùng dig để viết lại như sau:

... if params.dig(:user, :address, :somewhere_deep)

2. Object#presence_in

Phương thức trên cho phép bạn thay thế các điều kiện kiểm tra, và viết chúng lại 1 cách ngắn gọn Những cách viết thông thường

sort_options = [:by_date, :by_title, :by_author]
...
sort = sort_options.include?(params[:sort]) 
  ? params[:sort] 
  : :by_date
# Another option
sort = (sort_options.include?(params[:sort]) && params[:sort]) || :by_date

Trông tốt hơn chứ

params[:sort].presence_in(sort_options) || :by_date

3. Module#alias_attribute

Cơ bản là 1 cách cho phép bạn tạo các thuộc tính mới, bao gồm cả việc gọi phương thức hay truy vấn chúng Ví dụ chúng ta có 1 vài thuộc mới tạo kiểu như: "name" chẳng hạn, thì thay vì việc truy vấn như thế này

 WeirdTable.where(SERNUM_0:123)

Chúng ta có thể sử dụng alias_attribute như sau

alias_attribute :name, :ITMDES1_0
...
scope :by_name, -> (name) { where(name: name) }

4. Object#presence

Chúng ta sẽ kiểm tra object như sau

object.presence

Cách viết tương đương với:

object.present? ? object : nil

5. Module#delegate

Có rất nhiều bài nói về cách sử dụng delegate rồi, nhưng ở đây mình sẽ dùng ví dụ để thấy lợi ích của việc dùng delegate nhé

class Profile < ApplicationRecord
  belongs_to :user
  delegate :email, to: :user
end

...
profile.email # thay vì phải viết như thế này profile.user.email

6. Array#zip

Giả sử có 2 mảng cùng số phần tử, và muốn biến phần tử của mảng này thành key, còn phần tử mảng kia thành value tương ứng =)) Nghe hơi khó hiểu, nhưng thực tế mình gặp phải, cụ thể nhìn ví dụ nhé

a = ["1", "2", "3"]
b= ["a", "b", "c"]
--> mong muốn là hash = {"1" => "a", "2" => "b", "3" => "c"]

Chúng ta dùng zip như sau

Hash[a.zip b] = {"1" => "a", "2" => "b", "3" => "c"]
0