2011-01-06 63 views
30

Tôi đang thực hiện truy vấn này trong một ứng dụng điều khiển và 'Nhóm' Người dùng mô hình has_manyLàm thế nào để sắp xếp một mảng các đối tượng bằng một thuộc tính của các đối tượng?

@group= Group.find(params[:id]) 

@group đang được sử dụng để làm cho phần này (một phần bãi những người sử dụng của một nhóm vào một bảng)

<%= render :partial=>"user_list", :locals=>{:users=>@group.users} %> 

Biến cục bộ 'người dùng' được chuyển cho một phần là một mảng đối tượng Người dùng;

- !ruby/object:User 
    attributes: 
    updated_at: 2011-01-04 21:12:04 
    firstname: Bob 
    lastname: Smith 
    id: "15" 
    group_id: "2" 
    created_at: 2010-11-26 12:54:45 

Làm cách nào để mảng người dùng được sắp xếp theo 'họ'? Tôi đã thử nhiều cách khác nhau mà không có bất kỳ may mắn nào. Đang cố gắng sắp xếp theo một thuộc tính đối tượng bên trong một mảng làm tôi bối rối. Ngoài ra, tôi không cam kết làm thế nào tôi có thể làm điều này với một: thứ tự trong truy vấn (làm thế nào để: đặt hàng không phải là Nhóm nhưng Người dùng của mỗi nhóm)?

Có lẽ tôi không đề cập đến tên của đối tượng chính xác ('Người dùng')? Có vẻ như điều này sẽ hoạt động là nó tạo ra lỗi 'không có phương thức' (hoặc lỗi gán hằng số động nếu 'sort_by' được sử dụng mà không cần!):

users.sort_by! {|User| User.lastname} 

Cảm ơn sự giúp đỡ.

+3

sort_by! không có trong phiên bản 1.8.x ruby ​​hoặc ruby ​​1.9.1; nó được thêm vào ruby ​​1.9.2. – carols10cents

Trả lời

27

Tôi tìm thấy một phương pháp làm việc từ here. Tôi không hiểu những gì "&" biểu tượng đang làm - có thể nó là viết tắt của "đối tượng" vì trong trường hợp của tôi ": lastname" là một thuộc tính của đối tượng tạo nên mảng.

users = users.sort_by &:lastname 

lưu ý: Tôi không đảm bảo tại sao nhưng phiên bản phá hoại sẽ không hoạt động. Nó tạo ra một "phương thức undefined` sort_by! ' cho # "errror:

users.sort_by! &:lastname 
+4

"&" là viết tắt của phương thức "to_proc", trên biểu tượng, to_proc chuyển đổi nó thành gọi phương thức đó theo tên trên bất kỳ thứ gì được truyền vào. Giải thích ngắn gọn: http://pragdave.pragprog.com/pragdave /2005/11/symbolto_proc.html (lưu ý rằng đó là khá cũ, nó được xây dựng trong 1.9 và lên, IIRC, và được thêm bởi Rails trong phiên bản cũ) – Groxx

30

Xem http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/

@users.sort! { |a,b| a.name.downcase <=> b.name.downcase } 
+0

Cảm ơn, tôi đã nhận được lỗi "Đã xảy ra lỗi khi đánh giá nil.sort!" lỗi (tôi đã thay đổi 'name' thành 'lastname'). Có vẻ như ví dụ đó không xem xét rằng 'lastname' là một thuộc tính của mô hình User (nơi người dùng là một mảng các đối tượng User). – Reno

+0

nếu lỗi của bạn là "nil.sort!", Sự cố là người nhận sắp xếp tức là @users is nil. Giải quyết điều đó trước. –

+0

Cảm ơn. @users (hoặc trong trường hợp của tôi 'người dùng') không phải là không. Tôi khá chắc chắn vì ví dụ trên là cho các đối tượng của một mảng và không thuộc tính bên trong các đối tượng mảng đó. Phương pháp này đã làm việc (nơi tôi tin '&' là viết tắt của 'đối tượng): users = users.sort_by &: lastname – Reno

15

Có lẽ vì bạn đã có |User| khi User là một lớp. Hãy thử thay đổi nó vào một tên biến chưa sử dụng, giống như u, để có được:

users.sort_by! {|u| u.lastname} 

Thuật ngữ giữa các đường ống là tên của biến mỗi mục được lưu trữ trong, vì nó chạy qua, không phải là loại đối tượng bạn có. Điều này giống với các khối Ruby khác, chẳng hạn như do || end hoặc bất kỳ khối kiểu {||} nào khác.

+0

Cảm ơn, điều đó không hoạt động. Nó trả về một "phương thức undefined' sort_by!'for # "eror – Reno

+0

Xin lỗi về điều đó ^^; Không chắc tôi có thể gợi ý thêm gì nữa, đã lâu rồi tôi mới tham gia thế giới Ruby/Rails. – Groxx

+0

@reno Bạn có một phương thức không xác định 'sort_by!' Bởi vì bạn đang cố sắp xếp một đối tượng '' sort! 'Sẽ chỉ hoạt động trên một tập hợp các đối tượng (ví dụ: mảng các đối tượng) – adarsh

2

Bạn có thể thử đặt một khoản trật tự trong "has_many: Người dùng" dòng mà bạn có trong mô hình Nhóm bạn

+0

Làm việc như một sự quyến rũ - Cảm ơn bạn ! – Reno

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