ActiveRecord sucht und gibt nur ausgewählte Spalten zurück

88

bearbeiten 2

Wenn Sie darüber stolpern, überprüfen Sie beide Antworten, da ich jetzt Zupfen dafür verwenden würde


Ich habe einen ziemlich großen benutzerdefinierten Datensatz, den ich gerne zurückgeben würde, um als json ausgegeben zu werden. Ein Teil ist:

l=Location.find(row.id)
tmp[row.id]=l

aber ich würde gerne so etwas machen wie:

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

aber das scheint nicht zu funktionieren. Wie würde ich das zum Laufen bringen?

Vielen Dank

Bearbeiten Sie 1
alternativ. Gibt es eine Möglichkeit, ein Array nur mit den Attributen zu übergeben, die ich aufnehmen möchte?

Timpone
quelle

Antworten:

85

In Schienen 2

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

...oder...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

Dieses Referenzdokument enthält die gesamte Liste der Optionen, mit .finddenen Sie arbeiten können , einschließlich der Begrenzung nach Anzahl, ID oder einer anderen beliebigen Spalte / Einschränkung.

In Rails 3 mit ActiveRecord-Abfrageoberfläche

l = Location.where(["id = ?", id]).select("name, website, city").first

Ref: Active Record Query Interface

Sie können auch die Reihenfolge dieser verketteten Aufrufe austauschen. .select(...).where(...).firstAlle diese Aufrufe erstellen lediglich die SQL-Abfrage und senden sie dann ab.

Jefflunt
quelle
aber ich möchte nur eine einzige Instanz, nicht alle
Timpone
Ich habe meine Antwort bearbeitet. :limitsollte dies tun, oder :firstoder :lastoder was auch immer, je nachdem, was Sie wollen. Das Referenzdokument, auf das ich verlinkt habe, zeigt Ihnen, wie Sie das alles machen können.
Jefflunt
Aktualisiert, um aufzunehmen, wie eine äquivalente Abfrage in Rails 3 durchgeführt wird.
Jefflunt
204

zupfen (Spaltenname)

Diese Methode dient zur Auswahl durch eine einzelne Spalte als direkte SQL-Abfrage. Rückgabearray mit Werten des angegebenen Spaltennamens. Die Werte haben denselben Datentyp wie die Spalte.

Beispiele:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

Siehe http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

Die eingeführten Schienen ab 3.2 akzeptieren nur eine einzelne Säule. In Schienen 4 werden mehrere Spalten akzeptiert

prasad.surase
quelle
1
OK, das Zupfen mit mehreren Spalten ist fantastisch. Ich habe das gerade bei dieser Antwort gelernt. Rails 3 benötigt jedoch die akzeptierte Antwort.
Jay Shepherd
Die akzeptierte Antwort ist richtig, da das Zupfen damals nicht verfügbar war.
prasad.surase
User.pluck (: email ,: id) SELECT "users". "Email", "users". "Id" FROM "users"
pranav prashant
2
Model.uniq ist jetzt Model.distinct (zumindest in Rails 5).
Mrturtle
Anscheinend können Sie in Rails 3.2 Folgendes tun: Location.select([:name, :website, :city])Wenn Sie ein Array übergeben
CTS_AE
21

Meine Antwort kommt ziemlich spät, weil ich ein ziemlich neuer Entwickler bin. Folgendes können Sie tun:

Location.select(:name, :website, :city).find(row.id)

Übrigens ist dies Rails 4

tkhuynh
quelle
Dies sollte die ausgewählte Antwort sein und die Frage am direktesten beantworten.
Michael Wiltbank