Khác ở chỗ có chạy SQL không và có nạp record vào bộ nhớ không.
count— luôn chạySELECT COUNT(*), kể cả khi association đã được nạp. Không giữ record.length— luôn nạp toàn bộ record vào mảng rồi đếm trong Ruby.size— thông minh: nếu association đã nạp thì đếm trong bộ nhớ; nếu chưa thì chạyCOUNT(*). Nếu model có counter cache thìsizeđọc thẳng cột đếm, không chạy SQL nào.
ruby
post.comments.count # always SELECT COUNT(*)
post.comments.length # always loads all rows
post.comments.size # COUNT(*), or in-memory, or counter cache columnChọn trong thực tế:
- Chỉ cần con số, không cần record → count.
- Đằng nào cũng render danh sách ở ngay dưới → length (hoặc size sau khi đã includes), tránh chạy thêm một query đếm.
- Không chắc → size là mặc định an toàn nhất.
Gotcha kinh điển: trong view lặp qua nhiều post mà gọi post.comments.count sẽ tạo một COUNT query cho mỗi post — đây là dạng N+1 mà includes không cứu được; phải dùng counter cache hoặc gom đếm bằng group(:post_id).count.