5 Tips ruby on rails mà bạn có thể chưa biết đến

Nói về số năm kinh nghiệm ruby của mình khá là ít vì trước đó ngôn ngữ mình học và theo đuổi không phải là Ruby. Tuy nhiên khi đến với framgia và làm một số dự án với nó mình thấy khá là thú vị. Sau 1 năm làm về Ruby mình có một số tips hay ho cho bạn nào cần thiết, nếu ngôn từ mình diễn đạt hơi khó hiểu mong các bạn comment để mình rút kinh nghiệm cho các bài viết sắp tới. Mình hi vọng bài viết sẽ giúp các bạn code sạch hơn, dễ đọc và dễ bảo trì.

1. Hash#dig

Trước đây mình làm một số dự án maintaince đã code được 3,4 năm rồi, từ tận phiên bản ruby 1.8 và thấy ít khi sử dụng cách code này, và nó chỉ hoạt động từ phiên bản ruby 2.3 trở đi, và mình sẽ giới thiệu cho các bạn ngay và luôn. Chắc hẳn trong chúng ta đã gặp một đoạn code như sau.

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

Trong trường hợp này, tốt nhất các bạn nên dùng dig hơn là sử dụng &&, nhưng nó chỉ dùng được với hash. Các bạn có thể đọc thêm Hash#dig ở đây. Và chúng ta có thể viết lại như sau:

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

Các bạn thấy gọn hơn rất nhiều đúng không nào.

2. Object#presence_in

presence_in cho phép bạn thay thế các điều kiện khi bạn làm việc với 1 single method, ví dụ khi bạn không cần 1 kết quả trả về dạng boolean, nhưng vẫn muốn có thể kiểm tra chính nó xem true hay fasle. Ví dụ dưới đây:

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

Nhìn có vẻ không ổn lắm phải không. Bây giờ mình sẽ viết lại như sau:

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

Các bạn có thể tìm hiểu thêm ở đây.

3. Module#alias_attribute

Khi làm một số dự án nghiêng về phát triển hệ thống, hiệu suất của các câu query, bạn sẽ thường xuyên gặp một số trường khá là vô nghĩa kiểu như xyzNum0, Timeabc1. Khi mà có rất nhiều trường như vậy khiến bạn khá là rối trong việc truy vấn dữ liệu, vì vậy chúng ta hãy sử dụng alias_attribute, nó sẽ hoạt động như ví dụ dưới đây:

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

Lúc này bạn sẽ dễ dàng kiểm soát được các trường này, hiểu được các trường này có tác dụng gì trong hệ thống của bạn.

4. Object#presence

Về cái này chắc khá là nhiều người biết, các bạn có thể đọc kĩ hơn ở đây. Tức là khi sử dụng presence nếu dữ liệu tồn tại thì trả về còn không thì return về nil. Nó cũng tương tự đoạn code bên dưới:

object.present? ? object : nil

5. Module#delegate

Delegate là một trong những cách đó. Delegate giúp gọi các public methods của object khác giống như là của chính mình. Delegate rất hữu ích với Active Record associations.

class Profile < ApplicationRecord
  belongs_to :user
  delegate :email, to: :user
end
...
profile.email # equivalent to profile.user.email

Mình hi vọng bài viết trên sẽ giúp ích được cho các bạn nhiều hơn. Happy coding!