2016-03-19 12 views
4

diesem CodefragmentZugriff auf mehrere Werte von Hash-Rails

room = Room.find(roomId) 

eine einzelne Spalte von Raum Tabelle zurückgibt, enthält der zurückgegebene Wert mehrere Attribute, wie id, name, description, duration.

ich will, wenn

Codierung
render json: room 

nur duration und name zurückzukehren. muss ich so etwas wie, dass Sie

render json: room[:duration, :name] 

Antwort

2

schreiben können die only Möglichkeit as_json verwenden, um nur bestimmte Attribute enthalten.

render json: room.as_json(:only => [:duration, :name]) 
3

Abfrage, die Sie die Attribute nur geben, die Sie wollen:

room = Room.select(:id, :duration, :name).find(room_id) 
+0

Dies enthält tatsächlich immer noch Schlüssel-Wert-Paare für jede einzelne Spalte, auch wenn Sie sie nicht in das 'select' aufgenommen haben. Die anderen Werte sind einfach null. –

+0

@maxpleaner eigentlich nicht. das einzige, was es tut, ist ID, wenn leer. 'user = User.select (: id,: email) .find 152265' gibt' => # ' – toddmetheny

+1

ah Entschuldigung. editiere deine Antwort und ich kann sie verbessern. –

0

Sie sind etwas falsch, wenn Sie Room.find(roomId) kehrt eine „einzelne Spalte aus dem Raum Tabelle“ sagen. Es gibt tatsächlich eine einzelne Zeile zurück.

Wie auch immer, es gibt ein paar Möglichkeiten, wie Sie das tun können.

Ein guter Ausgangspunkt ist, die .attributes Methode für ein Modell zu verwenden, um es in einen Hash zu konvertieren.

Also sagen Sie zum Beispiel, Sie haben einen Benutzer mit einem Namen, E-Mail und ID-Spalten in der Datenbank. Sie können user.attributes anrufen, um { "name" => "max", "email" => "[email protected]", "id" => 5 } zu erhalten.

können Sie mit

user.select { |k,v| k.in?("name", "email") } nur den Namen und die E-Mail auswählen und to_json dann auf das Ergebnis nennen.

Um zu vermeiden, dass Sie für jede Controller-Antwort benutzerdefinierten to_json-Code schreiben müssen, können Sie .attributes im Modell überschreiben. Sag meine Benutzertabelle ein Passwort Spalt hat, die ich noch nie in meinem API verfügbar machen möge:

class User 
    def attributes 
    super.reject { |k,v| v.in?("password") } 
    end 
end 

Dann, wenn Sie eine Liste der Benutzer als JSON zurückgeben müssen:

von Pavan
render json: { users: @users.map(&:attributes) }.to_json, status: 200 

Die Antwort wird übrigens auch funktionieren.

Ein anderer Ansatz besteht darin, jbuilder zu verwenden und json "Ansichten" für Ihre Datensätze zu erstellen.

+0

Sie haben Recht, ich war falsch für das Schreiben Spalte statt Reihe, danke für Ihre Antwort –

Verwandte Themen