Trong ruby, phương thức length và size đều như nhau và đều đếm số phần tử có trong array hoặc hash.

array = [3, 4, 5]
puts "array length: #{array.length}"
puts "array size: " + array.size.to_s

hash = { a: 3, b: 4, c: 5, d:6 }
puts "hash length: " + hash.length.to_s
puts "hash size: #{hash.size} "

Đoạn code trên sẽ cho ra kết quả: 

array length: 3
array size: 3
hash length: 4
hash size: 4 

 

Trong ActiveRecord, khi đếm số phần tử của một dữ liệu quan hệ thì có thêm phương thức count nhưng 3 phương thức này hoạt động sẽ khác nhau tùy vào ngữ cảnh.

Xét ví dụ: Đếm số comment trong một post dùng post.comments

- post.comments.count luôn luôn thực hiện câu query SQL count vào DB, cho dù post.comments đã được load ra bộ nhớ trước đó hay không

- post.comments.length sẽ đếm số comment của post mà đã hiện hữu trong bộ nhớ. Khi post.comments đã được load ra bộ nhớ rồi mà bạn tạo thêm dữ liệu vào DB bằng cách comment.create(dữ liệu của post hiện tại) thì post.comment.length cũng sẽ không được update giá trị mới nhất vì nó luôn lấy dữ liệu từ bộ nhớ mà không gọi câu query mới vào DB.

- post.comments.size sẽ gọi hàm post.comments.length nếu dữ liệu đã có sẵn trong bộ nhớ, còn dữ liệu chưa có sẳn trong bộ nhớ thì nó sẽ gọi tới post.comment.count. Nghĩa là post.comments.size là kết hợp của 2 phương thức trên.

 

Sau đây là ví dụ minh họa:

post = Post.find(1)         // exec query

puts post.comments.length   // ex output 3
puts post.comments.size     // 3
puts post.comments.count    // exec count query and ouput 3

Comment.create(post_id: 1)  // add a comment of above post
puts post.comments.length   // still 3
puts post.comments.size     // still 3
puts post.comments.count    // exec count query and ouput 4

 

 

Kết luận:

 - Nếu bạn không có thao tác create hay update các bảng liên quan trong một tác vụ thì bạn có thể sử dụng size.

 - Hãy cẩn thận nếu bạn có update hay create vào bảng quan hệ, có thể bạn sẽ cần sử dụng count để thực hiện lại câu query lấy kết quả mới nhất.