- vừa được xem lúc

Tôi cá là bạn không biết những điều này - Ruby on rails ( Phần 2)

0 0 211

Người đăng: Tran Quang Huy B

Theo Viblo Asia

Các bạn có thể theo dõi phần 1 ở đây : https://viblo.asia/p/toi-ca-la-ban-khong-biet-nhung-dieu-nay-ruby-on-rails-phan-1-WAyK8DDeKxX

5. presence và ||

Giả sử chúng ta cần kiểm tra biến a có giá trị hay không, nếu a nil thì return biến b, ta thường viết a||b

Tuy nhiên nếu biến a có giá trị là một string rỗng "" hoặc một mảng rỗng [ ] hoặc một hash rỗng {}, khi đó ta dùng a||b sẽ trả về a chứ không phải b.

Đối với trường hợp chúng ta không muốn lấy 3 giá trị trên (vì bản chất chúng cũng là rỗng ), lúc này chúng ta cần dùng hàm presence kết hợp với ||

a.presence || b

Nó tương đương với a.present? ? a : b nhưng viết gọn hơn

Kết quả trả sẽ về b kể cả nếu a là string rỗng "" hoặc mảng rỗng [ ] hoặc hash rỗng {}

Ứng dụng của presence mình thấy khi làm dự án khá nhiều.

6. Tắt binding.pry bằng dấu !!!

Chắc hẳn chúng ta chẳng lạ gì gem binding pry , 1 gem hỗ trợ fix bug rất thông dụng.

Có bao giờ bạn ngại dùng binding.pry vào trong 1 vòng lặp vì nó sẽ dừng chương trình vào trong mỗi vòng lặp, bạn phải Ctrl + D rất nhiều lần mới thoát khỏi vòng lặp đó ?

Cách đơn giản trong trường hợp này đó là dùng dấu !!!. Quá trình binding.pry sẽ kết thúc ngay lập tức!

Ngoài ra, mình thường ứng dụng mẹo này trong việc tìm bug khi viết rspec vì thông thường khi viết rspec sẽ lặp qua 1 dòng lệnh rất nhiều lần.

7. Sort_by() array, group_by() array

Khi làm việc với mảng chứa các hash hoặc các record, nếu cần sắp xếp hoặc nhóm chúng ta thường dùng sort_by và group_by. Tuy nhiên nếu sort (hoặc group) theo nhiều điều kiện dưới đây thì sao ?

Có một mảng gồm 1 list record. Khách hàng yêu cầu sort theo :name, các dữ liệu cùng :name thì sort theo :age. Lúc này chúng ta sẽ làm như sau :

list_record.sort_by{|record| [record.name, record.age]}

Nếu muốn sort theo :age tăng dần

list_record.sort_by{|record| [record.name, -record.age]}

Tương tự, nếu muốn nhóm các record theo nhiều điều kiện giống nhau:

list_record.group_by{|record| [record.name, record.age]}

Tương tự, nếu muốn sort/group với các hash

list_record.sort_by{|record| [record[:name], record[:age]}
list_record.group_by{|record| [record[:name], record[:age]}

8. any? và all?

Trong ruby có 2 hàm kiểm tra mảng mà mình rất thích (và hay sử dụng) là all? và any? . Cả 2 đều trả về kết quả true hoặc false.

all? kiểm tra có phải tất cả phần tử đều thỏa mãn điều kiện trong block hay không, trong khi any? kiểm tra xem có tồn tại ít nhất 1 phần tử trong mảng thỏa mãn điều kiện hay không ?

>> (1..5).all? {|x| x > 0}
=> true
>> (1..5).all? {|x| x > 3}
=> false
>> (1..5).any? {|x| x > 4}
=> true
>> (1..5).any? {|x| x > 6}
=> false

*Nếu trong block không phải 1 condition thì cả 2 hàm đều trả về true

9. Scope trong điều kiện where

Có 1 list products, mỗi products belongs_to 1 members (thông qua trường member_id). Chúng ta cần lấy ra những products của member có giới tính là nam. Có rất nhiều cách viết, trong đó dưới đây là 1 cách :

Product.where(member_id: Member.where(gender: :male).ids)

Câu lệnh trên sẽ thực hiện 2 câu query. Đầu tiên lấy ids của member có gender là :male, sau đó lấy products tương ứng.Tuy nhiên chúng ta không cần viết .ids mà chỉ cần viết thành:

Product.where(member_id: Member.where(gender: :male))

Lúc này câu lệnh trên sẽ gom 2 câu query làm 1. Bất ngờ chưa ?Member.where(gender: :male) là 1 list record lại có thể đem so sánh với field member_id. Rails rất thông minh đúng không ?

Chưa hết, chúng ta có thể rút gọn ngắn hơn :

Product.where(member: Member.where(gender: :male))

(continue)

Thank you for your watching!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Bài toán tìm đường đi ngắn nhất với giải thuật Dijkstra

Với các bạn sinh viên chuyên ngành công nghệ thông tin, chắc không lạ gì với bài toán tìm đường đi ngắn nhất (Shortest Path Problems) trong đồ thị trọng số nữa. Ở bài viết lần này, mình sẽ làm 3 việc:.

0 0 122

- vừa được xem lúc

Những thay đổi trong ruby 3.0

. 2020 là một năm lớn đối với cộng đồng Ruby. Những người sáng lập Ruby có một món quà thực sự tuyệt vời cho chúng ta vào giáng sinh với việc phát hành Ruby 3.

0 0 31

- vừa được xem lúc

Có gì đặc biệt trong phiên bản Ruby 3x3 ?

Hello guys, chắc hẳn thời gian vừa rồi chúng ta cũng đã nghe qua thông tin Ruby sắp cho ra mắt Ruby version 3, hay còn được gọi là ruby 3x3, vậy liệu Ruby version 3 này có gì mới, và có những update nào đáng phải kể đến, và tại sao mọi người lại gọi nó là ruby version 3x3, thì trong bài ngày hôm nay

0 0 30

- vừa được xem lúc

Cách sử dụng class Time & Date trong Ruby (Phần 1)

Time là một class trong Ruby, nó sẽ giúp chỉnh sửa format, trích xuất thông tin một cách hiệu quả theo ý của bạn. . Topic hôm nay chúng ta có gì nào. .

0 0 83

- vừa được xem lúc

Ruby 3.0 có gì mới

Ruby 3.0.0 đã được ra mới được ra mắt vào tháng 12/2020, mục tiêu của bản 3.0.

0 0 26

- vừa được xem lúc

Gửi mail với Ruby

Giả sử bạn có một ứng dụng Ruby đang hoạt động và cần thêm chức năng gửi email vào ứng dụng đó. Điều này có thể liên quan đến xác thực người dùng hoặc bất kỳ loại email giao dịch nào khác, nó không có gì khác biệt.

0 0 27