2012-05-18 31 views

Trả lời

20

Tôi có vấn đề này và giải pháp là để thêm "to_date" để nó lặp trong những ngày, như vậy:

time_range = (1.month.ago.beginning_of_month.to_date..1.month.ago.end_of_month.to_date) 
+0

Điều này đã giải quyết được sự cố của tôi. Cảm ơn Flaviu – sadaf

4

Tôi nghĩ vấn đề của bạn là bạn đang thực hiện created_at = ?, time_range và time_range không phải là giá trị cụ thể và a = mong đợi một giá trị cụ thể. Không thể giải thích chính xác lý do cho lỗi đó, nhưng có thể giúp bạn giải quyết.

Làm điều này thay vào đó, tôi đã thử nó và hoạt động tuyệt vời

1.9.3-p125 :014 > time_range = (1.month.ago.beginning_of_month..1.month.ago.end_of_month) 
=> Sun, 01 Apr 2012 00:00:00 UTC +00:00..Mon, 30 Apr 2012 23:59:59 UTC +00:00 
1.9.3-p125 :015 > Post.where(:created_at => time_range).where('id not in (?)', [1,2,3]).count 
    (0.3ms) SELECT COUNT(*) FROM "posts" WHERE ("posts"."created_at" BETWEEN '2012-04-01 00:00:00.000000' AND '2012-04-30 23:59:59.999999') AND (id not in (1,2,3)) 
=> 0 

CẬP NHẬT

Không liên quan trực tiếp đến câu hỏi, nhưng bạn nên đặt những điều kiện trong phạm vi có ý nghĩa ngữ nghĩa nên bạn sẽ có Feed.from_last_month và một cái gì đó như Feed.not_with_ids([1,2,3])

Và cho hàng đợi của bạn ry bạn sẽ làm gì

Feed.from_month.not_with_ids([1,2,3]).count 

Đối với lời giải thích về cảnh báo kiểm tra những nhận xét dưới đây @echristopherson

+0

Rails có đủ thông minh để giải nén 'Range' khi sử dụng ': created_at =>', nhưng không phải khi 'created_at' là một phần của SQL thô? – echristopherson

+0

Đó là điều, trong trường hợp đầu tiên bạn để Rails làm phép thuật của mình, theo cách thứ hai bạn đang nói rõ ràng những gì cần đặt trong truy vấn;) Hãy để Rails làm phép thuật của mình vì lợi ích của riêng bạn. –

+3

Lý do cơ bản cho cảnh báo là lặp lại trên 'Phạm vi' sử dụng '# succ' để đạt được mục tiếp theo mỗi lần; và bắt đầu từ Ruby 1.9.2 'Thời gian # succ' được đánh dấu là lỗi thời bởi vì thời gian thực sự không có người kế thừa rời rạc; việc triển khai trước 1.9.2 chỉ sử dụng quy ước tùy ý chia thời gian thành giây. Điều này xuất hiện khi giải nén một 'Phạm vi' thành một mảng', đó là những gì Rails cố gắng làm ở đây. – echristopherson

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