12/08/2018, 13:53

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: alt

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.

0