Một số method hay sử dụng trong rails
Trong bài này mình xin giới thiệu một số method rất quen thuộc mà chúng ta hay sử dụng trong rails như try, blank?, present?... Sử dụng Object#try(:method_name) thay vì kiểm tra nil. ví dụ như sau: if parent . children && parent . children . singleton ? singleton = parent . ...
Trong bài này mình xin giới thiệu một số method rất quen thuộc mà chúng ta hay sử dụng trong rails như try, blank?, present?...
Sử dụng Object#try(:method_name) thay vì kiểm tra nil.
ví dụ như sau:
if parent.children && parent.children.singleton? singleton = parent.children.first send_mail_to(singleton) end
Khi nhìn vào điều kiện if ở trên ta có thể thấy phải kiểm tra 2 điều kiện thứ nhất là parent.children phải tồn tại rồi lại kiếm tra tiếp parent.children.singleton?. Viết như thế có vẻ hơi dài, thay vào ta có thể viết như sau sử dụng method try:
if parent.children.try(:singleton?) singleton = parent.children.first send_mail_to(singleton) end
Sử dụng nil?/blank?/present?
.nil? có thể sử dụng cho object. Sẽ trả về kết quả true nếu object là nil.
nil.nil? => true
.empty? có thể sử dụng với string, array, và hash. Sẽ trả về là true nếu:
- String length == 0
- Array length == 0
- Hash length == 0
ví dụ:
# String name = nil name.blank? # => true name = "" name.blank? # => true name = " " name.blank? # => true name = "Tom" name.blank? # => false # Array numbers = nil numbers.blank? # => true numbers = [] numbers.blank? # => true numbers = [1, 2, 3] numbers.blank? # => false # Hash params = nil params.blank? # => true params = {} params.blank? # => true params = { name: "Tom", email: "hoge@hoge.com" } params.blank? # => false
present? ngược lại với blank?.
# String name = "" name.present? # => false name = "Tom" name.present? # => true
ta có thể tổng hợp lại như sau:
Sử dụng presence
if user.name.blank? name = "What's your name?" else name = user.name end
đoạn code trên ta có thể viết lại:
name = user.name.presence || "What's your name?"
"".presence hoặc [].presence sẽ trả về nil.
name = "" puts name.presence || "What's your name?" # => What's your name?
Ngoài ra còn ví dụ như sau:
good_news = company.good_news if good_news.count > 0 send_mail(good_news) tweet(good_news) end
Nếu có bất cứ 1 news nào thì sẽ thực kiện lệnh trong điều kiện if. t có thể viết lại:
if good_news = company.good_news.presence send_mail(good_news) tweet(good_news) end
Cái này cũng tương tự đối với string. Khi kiểm tra sự tồn tại 1 string thì nên sử dụng blank? thay vì nil?.
Mệnh đề “string không có giá trị” thường không cần phân biệt nil và "". Khi sử dụng nil? thì lại cho 2 kết quả khác nhau.
if email.nil? # => nếu email là "" thì vẫn được coi là có nhập dữ liệu và không gọi puts puts "Please input email!" end
Tương tự như thế, khi validates trong Model, nếu không có lý do đặc biệt thì nên sử dụng allow_blank: true, không nên sử dụng allow_nil: true.
Khi cần filter, nên dùng query thay vì logic Ruby cung cấp rất nhiều method hay và đơn giản để thao tác với array, nhưng khi cần thực hiện filter trong model của Rails, thì nên sử dụng query để tốc độ xử lý được nhanh hơn.
def admin_users User.all.select(&:admin?) end
===>
def admin_users User.where(admin: true) end
Dùng pluck thay vì map pluck là method để lấy 1 column cho trước trong các record, mà không load toàn bộ các record đó. Vì thế mà tốc độ xử lý và RAM cũng hiệu quả hơn.
def admin_user_ids User.where(admin: true).map(&:id) end
def admin_user_ids User.where(admin: true).pluck(:id) end
Các method thời gian
Date.current # => Sun, 25 Sep 2016 Date.yesterday # => Sat, 24 Sep 2016 Date.tomorrow # => # => Mon, 26 Sep 2016 2.years.ago # => Thu, 25 Sep 2014 16:13:50 UTC +00:00 2.years.since # => Tue, 25 Sep 2018 16:14:05 UTC +00:00 2.months.ago # => Mon, 25 Jul 2016 16:14:17 UTC +00:00 2.months.since # => Fri, 25 Nov 2016 16:14:33 UTC +00:00
Ngoài ra còn rất nhiều cách viết khác nhau để lấy giá trị ngày tháng đặc biệt.
date = Date.current # => Sun, 25 Sep 2016 date.yesterday # => Sat, 24 Sep 2016 date.tomoroow # => Mon, 26 Sep 2016 date.prev_day # => Sat, 24 Sep 2016 date.next_day # => Mon, 26 Sep 2016 date.prev_day(2) # => Fri, 23 Sep 2016 date.next_day(2) # => Tue, 27 Sep 2016 date - 2.days # => Fri, 23 Sep 2016 date + 2.days # => Tue, 27 Sep 2016 date.ago(2.days) # => Fri, 23 Sep 2016 00:00:00 UTC +00:00 date.since(2.days) # => Tue, 27 Sep 2016 00:00:00 UTC +00:00 date.prev_month # => Thu, 25 Aug 2016 date.next_month # => Tue, 25 Oct 2016
Các method thay đổi string thành số nhiều, số ít,...
"my_book".camelize # => "MyBook" "MyBook".underscore # => "my_book" "my_book".dasherize # => "my-book" "book".pluralize # => "books" "person".pluralize # => "people" "fish".pluralize # => "fish" "book_and_person".pluralize # => "book_and_people" "book and person".pluralize # => "book and people" "BookAndPerson".pluralize # => "BookAndPeople" "books".singularize # => "book" "people".singularize # => "person" "books_and_people".singularize # => "books_and_person" "books and people".singularize # => "books and person" "BooksAndPeople".singularize # => "BooksAndPerson" "my_books".humanize # => "My books" "my_books".titleize # => "My Books" "my_book".classify # => "MyBook" "my_books".classify # => "MyBook" "my_book".tableize # => "my_books" "MyBook".tableize # => "my_books"
Squish xoá các space không cần thiết
" My books ".squish # => "My books"
Trên đây la một số method rất hay sử dụng trong rails. Cảm ơn các bạn đã đọc bài của mình.