2013-08-01 4 views
12

La documentazione: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fieldsRuby-on-Rails: selezionando i valori distinti dal modello

chiaramente che:

query = Client.select(:name).distinct 
# => Returns unique names 

Tuttavia, quando tento che nel mio controller, ottengo il seguente errore :

undefined method `distinct' for #<ActiveRecord::Relation:0xb2f6f2cc> 

Per essere chiari, io voglio i nomi distinti, come [ 'George', 'Brandon'], non i clienti record attuali. C'è qualcosa che mi manca?

+0

Quale versione di Rails stai usando? – tadman

+0

ruby ​​1.9.2p290 (2011-07-09 revisione 32553) [i686-linux] –

+1

Questa è la tua versione di Ruby, che è effettivamente obsoleta. Dovresti usare 1.9.3 o meglio. 'rails -v' ti dirà quale versione di Rails stai usando. – tadman

risposta

34

L'opzione .distinct è stata aggiunta per i binari 4, a cui si riferiscono le ultime guide. Se siete ancora su rotaie 3 sarà necessario utilizzare:

Client.select(:name).uniq 

Se si guarda l'equivalente section of the rails 3 guide si può vedere la differenza tra le due versioni.

+0

Questo preleverà tutti i record da db su Rails 3. – Santhosh

+1

Il link guida afferma esplicitamente che farà 'SELECT DISTINCT name FROM clients'. Sì, recupererà tutti i nomi distinti ma non recupererà tutti i record. – Shadwell

+0

Funziona su Rails 3.2, ma non su 3.1. Ho controllato. – Santhosh

0

Questo funziona per Rails 3 e 4.

Client.select('distinct(name)') 

Questo effettivamente utilizzare SQL SELECT distinta

SELECT distinct name FROM clients

+0

questo non sempre funziona nel caso in cui tu a due istruzioni select: scope = Client.select ("nome distinto"); scope = scope.select ("indirizzo"); Si può finire con sql non valido: "selezionare indirizzo, nome distinto dai client" – cmrichards

+0

Mettere '()' attorno alla colonna risolve il problema. Aggiornato la mia risposta. Grazie :) – Santhosh

0

Se non si desidera ActiveRecord :: Relazioni restituito, proprio una serie di nomi come stringhe, quindi utilizzare:

Client.distinct.pluck(:name) 

Per ottenere un set di risultati ordinato:

Client.order(:name).distinct.pluck(:name) 
+0

Non funziona con Rails 3, come indicato sopra. – Dennis