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"]