2012-10-06 29 views
6

Tôi có một kiểu gọi là Story mà tôi đang cố gắng đặt hàng trước ngày created_at. Kể từ khi tôi đã tổ chức ứng dụng của tôi trên Heroku, trong đó sử dụng PostgreSQL, tôi đã điều sau đây trong điều khiển của tôi:Đường ray: đặt hàng theo ngày trong Postgres trả lại thứ tự không chính xác

@stories = Story.find(:all, :order => "DATE(created_at) DESC" , :limit => 11) 

tôi sẽ mong đợi điều này để cung cấp cho 11 đầu tiên của câu chuyện của tôi, sắp xếp theo ngày tạo, với câu chuyện mới nhất đầu tiên.

Rất tiếc, tính năng này không hoạt động. Hầu hết các câu chuyện được trả lại một cách chính xác, nhưng hai câu chuyện đầu tiên bị lật. Đó là, câu chuyện mới nhất xuất hiện thứ hai trong danh sách.

Tại sao điều này là? Tôi có một nghi ngờ lén lút rằng kết quả của tôi không được đặt hàng ở tất cả hoặc đang được đặt hàng trên cột sai (có thể id?) Và cho đến bây giờ nó chỉ xảy ra được lệnh như tôi mong đợi khi hiển thị trên trang chỉ mục của tôi. Làm thế nào tôi có thể làm cho nó để đặt hàng như tôi mong đợi nó?

Trong trường hợp bất kỳ ai quan tâm, chế độ xem chỉ mục chỉ hiển thị các câu chuyện theo thứ tự. Đó là (HAML):

- @stories.each do |story| 
    = render :partial => "event", :locals => { :event => story } 

EDIT

Tôi nghi ngờ rằng created_at là một cột datetime và DATE(...) chức năng không quan tâm đến phần thời gian. Vì vậy, nó trả về các phần tử được tạo trong cùng một ngày theo một thứ tự ngẫu nhiên. Kể từ khi hai câu chuyện đầu tiên được tạo ra trong cùng một ngày, nhưng cách nhau vài giờ, điều này sẽ giải thích tại sao chúng dường như bị 'đảo ngược'. Nếu đây là trường hợp, cú pháp chính xác sẽ được sắp xếp theo cả ngày giờ?

Trả lời

10

Tôi tin rằng bạn muốn:

@stories = Story.find(:all, :order => "created_at DESC" , :limit => 11) 

Cập nhật cho Rails 3+:

@stories = Story.order(created_at: :desc).limit(11) 
+0

Điều đó đã xảy ra. Cảm ơn. –

3

Nếu bạn đang sử dụng Rails 3, tôi cũng sẽ khuyến khích bạn sử dụng cú pháp truy vấn mới mát mẻ mà sẽ be:

@stories = Story.order('created_at DESC').limit(11) 

Xem Active Record Query Interface để biết thêm thông tin.

+0

Tôi đã thử sử dụng '.limit (11)' và Rails đã cho tôi một thông báo lỗi về cú pháp không được công nhận. –

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