2013-08-01 14 views
12

Die docs: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fieldsRuby on Rails: Auswahl verschiedene Werte aus dem Modell

klarstellen, dass:

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

Allerdings, wenn ich versuche, dass in meinem Controller, ich die folgende Fehlermeldung erhalten :

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

klar sein, möchte ich die verschiedenen Namen, wie [ 'George', 'Brandon'], nicht die tatsächlichen Aufzeichnungen Kunden. Gibt es etwas, das ich vermisse?

+0

Welche Version von Rails verwenden Sie? – tadman

+0

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

+1

Das ist Ihre Ruby-Version, die eigentlich veraltet ist. Sie sollten 1.9.3 oder besser verwenden. 'rails -v' sagt Ihnen, welche Version von Rails Sie verwenden. – tadman

Antwort

34

Die Option .distinct wurde für Schienen 4 hinzugefügt, auf die sich die neuesten Anleitungen beziehen. Wenn Sie noch auf den Schienen 3 sind, werden Sie verwenden müssen:

Client.select(:name).uniq 

Wenn Sie das Äquivalent section of the rails 3 guide sehen Sie den Unterschied zwischen den beiden Versionen sehen. nur

+0

Dadurch werden alle Datensätze von db auf Rails 3 abgerufen. – Santhosh

+1

Der Leitfaden Link explizit sagt es wird 'SELECT DISTINCT name FROM clients'. Ja, es werden alle eindeutigen Namen abgerufen, aber es werden nicht alle Datensätze abgerufen. – Shadwell

+0

Es funktioniert auf Rails 3.2, aber nicht auf 3.1. Ich überprüfte. – Santhosh

0

für Rails Diese Arbeit wird 3 und 4.

Client.select('distinct(name)') 

Dies wird tatsächlich nutzen die SQL-Anweisung select distinct

SELECT distinct name FROM clients

+0

Dies wird nicht immer funktionieren, wenn Sie zwei Anweisungen auswählen: scope = Client.select ("distinct name"); scope = scope.select ("Adresse"); Sie können mit dem ungültigen sql enden: "wählen Sie Adresse, eindeutigen Namen von Kunden" – cmrichards

+0

Putting '()' um die Spalte löst dieses Problem. Meine Antwort wurde aktualisiert. Danke :) – Santhosh

0

Wenn Sie Active nicht wollen :: Beziehungen zurück, ein Array der Namen als Zeichenfolgen, verwenden Sie dann:

Client.distinct.pluck(:name) 

Um eine bestellte Ergebnismenge zu erhalten:

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

Funktioniert nicht mit Rails 3, wie oben erwähnt. – Dennis