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?

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.


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


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


Dies sollte die ausgewählte Antwort sein und die Frage am direktesten beantworten.
Michael Wiltbank
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.