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

Thực ra tiêu đề đúng phải là : "Tôi đã từng bất ngờ khi biết những điều này" , nhưng viết vậy thì có ma nào vào xem bài viết của mình chứ 😅😅😅

Không dài dòng nữa, bắt đầu thôi nào!

1. Count và Size

Hai thằng này chắc mọi người chẳng còn lạ gì, tuy nhiên để tìm hiểu bản chất của nó, chúng ta hãy làm thử thí nghiệm đơn giản sau xem nhé!

Đầu tiên chạy rails c :

$ rails c
>> users = User.where(id: 1)
>> users.first
=> {id: 1, name: "Nam"}

users.count hay user.size đều sẽ trả về giá trị là 1.

Nhưng nếu ta thử :

  >> users = User.where(id: 1).group(:id)
  >> users.first
  => {id: 1, name: "Nam"}

users.first vẫn ko thay đổi kết quả nhận được , nhưng users.count và users.size thì sao ?

Kết quả :

 >> users.size
 => 1
 >> users.count
 => {1 =>1}

Lý giải cho điều này. Hàm countsize đối với mảng, hash là như nhau, nhưng nếu dùng với 1 active record thì size sẽ đếm số phần tử như bình thường còn count sẽ thực hiện câu truy vấn vào db để đếm (câu lệnh SELECT COUNT (*).. . ). users ở trường hợp này là 1 bảng tạm gồm 2 field :id được group và 1 field gồm những record có chung :id được nhóm lại với nhau, chính vì vậy SELECT COUNT sẽ đếm cả 2 field này và cho ra kết quả là 1 hash {1 => 1}

Vẫn là database như trên nếu ta đếm trực tiếp như thế này thì trả về gì ?

  >> User.where(id: 1).group(:id).count
  >> User.where(id: 1).group(:id).size
  >> User.where(id: 1).group(:id).length

Hãy thử xem để thấy điều bất ngờ nhé 😄 (điều này cũng dễ giải thích thôi )

2 . if @user và if @user.present?

Về cơ bản cả 2 cách viết này đều kiểm tra @user có tồn tại hay không. Cách viết if @user rõ ràng là ngắn gọn hơn và thường được các coder cứng tay ưu tiên sử dụng hơn. Tuy nhiên không phải lúc nào cũng nên lạm dụng cách viết này.

Đó là trong trưởng hợp @user chúng ta cần trả về 1 mảng, lúc này nếu @user trả về 1 mảng rỗng [], có nghĩa là không tồn tại , nhưng if @user vẫn trả về true, còn if @user.present? trả về false. Hãy lưu ý điều này khi kiểm tra sự tồn tại của 1 mảng nhé.

Tương tự nếu chúng ta dùng với biến local: if user và if user.present? , tuy nhiên trước hết nhớ define biến local ra đã nhé 😄

3. Biến instance và biến local

Biến instance thì có @ phía trước ví dụ : @user , @member, @book ...., còn biến local thì chỉ là những chữ cái viết thường ví dụ : name, member, user ....

Đối với biến instance, nếu @user chưa từng khai báo, @user sẽ trả ra nil, vì vậy chúng ta dùng @user.present? sẽ trả về false và không có chuyện gì nghiêm trọng xảy ra. Đối với biến local , nếu user chưa từng khai báo, chúng ta dùng user.present? sẽ bắn ra lỗi "local varible undefine" ( biến local chưa được khởi tạo )

Tuy nhiên chúng ta chạy thử

$ rails c
>> if 5 > 6
>> a = 100
>> end
>> a

Đây là kiến thức mình thấy được sử dụng khá phổ biến trong controller/service.

Câu lệnh trên có nghĩa là nếu 5 >6 thì chúng ta sẽ define a = 100, nhưng điều nãy rõ ràng không xảy ra vì 5 <6, vậy nếu chúng ta return a thì có bắn lỗi "local varible undefine" không ? Câu trả lời là không, kết quả nhận được là nil nhé !

Thank you for watching!


All Rights Reserved