2009-01-04 35 views
12

Rất nhiều Rails: Tôi vừa phát hiện ra named_scope nhờ một người dùng SO khác. :)Sử dụng named_scope để nhận số hàng

Tôi muốn đếm số lượng hàng - ví dụ: SELECT COUNT(*). Ngoài ra, tôi vẫn muốn có thể chuỗi các phạm vi được đặt tên trong cuộc gọi.

Đây có phải là cách sử dụng hợp pháp (mặc dù kỳ lạ) của phạm vi được đặt tên không?

named_scope :count, :select => "COUNT(*) as count_all" 

Vì vậy, sau đó tôi có thể làm (ví dụ):

@foobar = Foobar.count.scope.scope.scope 

Số đếm được truy cập thông qua @foobar.first.count_all.

(Edited để giải quyết ý kiến ​​của Allan)

Bạn có thể làm:

@foobar = Foobar.scope.scope.scope.size 

Nhưng điều này sẽ gây ra một truy vấn kết quả và không phải là SELECT COUNT(*) truy vấn nhanh hơn. Tôi có một số lượng lớn các hàng trong cơ sở dữ liệu mà tôi đang truy vấn.

Có cách nào tốt hơn để thực hiện việc này không?

Trả lời

20

Các chức năng bạn đang tìm kiếm được xây dựng trong

Foobar.count # SELECT count(*) AS count_all FROM "foobars" 
Foobar.named_scope.count # SELECT count(*) AS count_all FROM "foobars" WHERE .... 

Nếu bạn chạy script/server trong chế độ nhà phát triển, bạn sẽ thấy các truy vấn khi chúng được thực thi.

+3

Duh. Đôi khi mọi thứ rất dễ dàng trong đường ray tôi nhớ rõ ràng. Cảm ơn! – unknownuser

+0

Hãy sửa tôi nếu tôi lo lắng nhưng điều này dường như không hoạt động nếu phạm vi được đặt tên của bạn trông giống như sau: def self.with_full_name select ("users. *, CONCAT (first_name, last_name) AS full_name") kết thúc –

2

Tôi không nghĩ rằng điều này là chính xác cả. Các phạm vi được sử dụng để tinh chỉnh các phát biểu tìm và truy vấn đếm sẽ không hoạt động tốt với các câu lệnh này.

2

Có cách tốt hơn để làm điều này, đường ray đã cung cấp cho bạn phương tiện.

Sử dụng ví dụ của bạn, bạn chỉ có thể làm điều này:

@foobar_size = Foobar.all.size #returns integer equal to total rows of Foobar 

và thậm chí phạm vi nó như vậy:.

@banned_foobars = Foobar.scope_to_find_banned.size #returns integer equal to total rows for "scope_to_find_banned" 
+0

Đây là những gì ban đầu tôi đã thử. Vấn đề với điều này là nó không tận dụng thực tế là SELECT COUNT (*) là một truy vấn tương đối nhanh. Nó sẽ thực hiện một truy vấn hàng và chậm hơn nhiều. – unknownuser

+0

Ah! Tôi hiểu ý bạn là gì. Hãy tha thứ cho sự hiểu lầm của tôi. –

Các vấn đề liên quan