2011-04-21 44 views
57

trong ứng dụng ray của tôi, tôi đang tạo ra một mảng như sau:Rails, Ruby, làm thế nào để sắp xếp một Array?

@messages.each do |message| 

    @list << { 
    :id => message.id, 
    :title => message.title, 
    :time_ago => message.replies.first.created_at 
    } 
end 

Sau khi thực hiện mảng này tôi muốn sau đó sắp xếp nó theo lệnh ASC TIME_AGO, là có thể?

Trả lời

119
@list.sort_by{|e| e[:time_ago]} 

nó mặc định là ASC, tuy nhiên nếu bạn muốn DESC bạn có thể làm:

@list.sort_by{|e| -e[:time_ago]} 

Ngoài ra, có vẻ như bạn đang cố gắng xây dựng danh sách từ @messages. Bạn chỉ cần thực hiện:

@list = @messages.map{|m| 
    {:id => m.id, :title => m.title, :time_ago => m.replies.first.created_at } 
} 
+0

Vì vậy, tôi làm điều này trước khi tôi xây dựng @list? hoặc là? Tôi đã thử nó sau và nó lỗi với: NoMethodError (phương thức undefined 'time_ago 'cho # ): – AnApprentice

+1

Bạn làm điều này sau khi bạn xây dựng' @ list'. Vì vậy, '@messages.each do | tin nhắn | @list << { : id => message.id, : title => message.title, : TIME_AGO => message.replies.first.created_at } end' '@ list.sort_by. ..' –

+3

Đối với DESC, đã cố gắng có, phương pháp không xác định '- @ 'cho Wed Apr 20 20:40:35 UTC 2011: Time – AnApprentice

10

Bạn có thể làm:

@list.sort {|a, b| a[:time_ago] <=> b[:time_ago]} 
+2

Tốt hơn, '@list.sort_by {| m | m [: time_ago]} '. –

5

Bạn cũng có thể làm @list.sort_by { |message| message.time_ago }

+0

Cảm ơn nhưng làm thế nào để bạn xác định thứ tự sắp xếp? – AnApprentice

+0

Bạn xác định thứ tự sắp xếp với '{| message | message.time_ago} 'một phần. Nó được gọi là 'sort_by' vì nó sắp xếp theo tiêu chí trong khối. Ở đây, chúng ta đang nói để sắp xếp thành viên '.time_ago' của các phần tử. Nó luôn luôn sắp xếp tăng dần. Để sắp xếp giảm dần, chúng tôi có thể sắp xếp tăng dần theo giá trị âm của giá trị đó, như được mô tả trong câu trả lời của Mike Lewis. :) Nếu nó không hoạt động, đó là bởi vì bất kỳ loại 'time_ago' đã không xác định phủ định. :/ –

3

Chỉ cần thông báo, tôi không thấy điểm chuyển thư vào danh sách mới và sau đó sắp xếp chúng. Miễn là nó là ActiveRecord nó nên được thực hiện trực tiếp khi truy vấn cơ sở dữ liệu theo ý kiến ​​của tôi.

Dường như bạn sẽ có thể làm điều đó như thế này:

@messages = Message.includes(:replies).order("replies.created_at ASC") 

Đó nên là đủ, trừ khi tôi đã hiểu lầm mục đích này.

3

Trong ray 4+

@list.sort_by(&:time_ago) 
Các vấn đề liên quan