2011-01-06 19 views
30

sto eseguendo questa query in un controler e il 'Gruppo' Utenti modello has_manyCome ordinare una matrice di oggetti per un attributo degli oggetti?

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

@group viene utilizzato per rendere questo parziale (parziale discariche gli utenti di un gruppo in una tabella)

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

La variabile locale 'users' passata al partial è una matrice di oggetti User;

- !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 

Come si può ordinare l'array utente per "lastname"? Ho provato diversi modi senza fortuna. Cercando di ordinare da un attributo di un oggetto all'interno di un array confondendomi. Inoltre, non sottovaluto il modo in cui posso farlo con: ordine nella query (come: ordinare non il Gruppo ma gli utenti di ciascun gruppo)?

Forse non mi riferisco al nome dell'oggetto correttamente ('Utente')? Sembra che questo dovrebbe funzionare sia esso produce un errore di 'nessun metodo' (o un errore di costante dinamica se 'sort_by' viene utilizzato senza l'!):

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

Grazie per qualsiasi aiuto.

+3

sort_by! non è in rubino 1.8.x o rubino 1.9.1; è stato aggiunto nel rubino 1.9.2. – carols10cents

risposta

27

ho trovato un metodo che funziona da here. Non capisco cosa stia facendo il simbolo "&" - forse è shorthad per "oggetto" poiché nel mio caso ": lastname" è un attributo dell'oggetto che compone l'array.

users = users.sort_by &:lastname 

nota: non capisco perché, ma una versione distruttiva non funzionerà. Produce un "metodo non definito` sort_by! ' per # "errror:

users.sort_by! &:lastname 
+4

"&" è una scorciatoia per il metodo "to_proc". Su simboli, to_proc lo converte essenzialmente in chiamare quel metodo per nome su ciò che viene passato. Una breve spiegazione: http://pragdave.pragprog.com/pragdave /2005/11/symbolto_proc.html (si noti che è piuttosto vecchio, è integrato in 1.9 e versioni successive, IIRC e viene aggiunto da Rails nelle versioni precedenti) – Groxx

30

Vedi 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

Grazie, ho ricevuto un "L'errore si è verificato durante la valutazione di nil.sort!" errore (ho cambiato 'nome' in 'cognome'). Sembra che l'esempio non prenda in considerazione il fatto che 'lastname' è un attributo del modello User (dove gli utenti sono un array di oggetti User). – Reno

+0

se il tuo errore è "nil.sort!", Il problema è il ricevitore di ordinamento, ad esempio, @users è nullo. Risolvilo per primo –

+0

Grazie. @users (o nel mio caso "utenti") non è nullo. Sono piuttosto sicuro perché l'esempio sopra è per gli oggetti di un array e non per gli attributi all'interno di questi oggetti di array. Questo metodo ha funzionato (dove credo '&' sta per 'oggetto): users = users.sort_by &: cognome – Reno

15

E 'probabilmente perché hai |User| quando User è una classe. Prova a cambiarlo con un nome di variabile non-usato, come u, per ottenere:

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

Il termine tra i tubi è il nome della variabile ogni elemento viene memorizzato in, in quanto passa attraverso, non il tipo di oggetto che hai È lo stesso degli altri blocchi Ruby, come do || end o qualsiasi altro blocco {||}.

+0

Grazie, non ha funzionato. Ha restituito un "metodo non definito' sort_by!'per # "eror – Reno

+0

Scusa per quello ^^; Non sono sicuro di poter suggerire qualcosa di più, è da un po' che non faccio parte del mondo di Ruby/Rails. ! – Groxx

+0

@reno Hai ottenuto un metodo non definito 'sort_by!' Perché stai cercando di ordinare un oggetto. 'Ordina!' Funziona solo su una collezione di oggetti (ad es. Array di oggetti) – adarsh

2

Si può provare a mettere una clausola di ordine nel "has_many: gli utenti" linea che avete nel vostro modello di Gruppo

+0

Funziona come un incantesimo - Grazie ! – Reno

Problemi correlati