2016-07-04 4 views
1

Ich habe versucht, ein Modell zu bekommen, das die id column nicht enthält. Ich denke, dass die Methode select dies erlaubt, aber wenn ich auf Modelle zugreife, sehe ich das id Feld mit nil Wert.rails: Wie kann eine bestimmte Eigenschaft aus einem Array von Objekten in einer JSON-Antwort weggelassen werden?

Wenn ich:

module API 
    class MyController < ActionController::API 
    def index 
     response = MyModel 
       .where("value > ?", 0) 
       .select('code','value') 
     render json: response, status: 200 
    end 

Wenn ich inspizieren das Ergebnis jedes ähnliche

MyModel .wo ("? Value>", 0) .select ('Code' mit‘ Wert ') .each {| m | m stellt}

Ich erhalte diese

<MyModel id: nil, code: "110", value: 100> 
<MyModel id: nil, code: "111", value: 100> 
<MyModel id: nil, code: "112", value: 100> 

und in meiner Antwort, die ich erhalten diese:

[{id: null, code: "110", value: 100},{id: null, code: "111", value: 100},{id: null, code: "112", value: 100}] 

Wie die Spalte id weglassen?

+0

Warum versuchen Sie dies zu tun? Welches Problem versuchen Sie zu lösen? –

+0

@jordan Ich brauche ein Array von 'MyModel', aber ohne das ID-Feld enthalten –

+0

Richtig, du hast es schon gesagt. Aber welches Problem versuchen Sie zu lösen? Sie wollen "ein Array zurückgeben", aber wohin? Was ist der Anwendungsfall? Es ist Ihnen bereits gelungen, nur die Felder 'code' und' value' aus der Datenbank auszuwählen, weshalb das 'id' Attribut 'nil' ist. –

Antwort

0

Ich glaube, es ist etwas mit dem puts Befehl. Wenn Sie nur Model.select(:attributes) tun, sollte es ID Spalte nicht zurückgeben, wenn es nicht in der Liste ist (hat den Test hier und funktioniert gut). Ich glaube, der Puts-Befehl ruft das Objekt aus der Datenbank oder ähnlichem ab. By the way, können Sie außer Kraft setzen, was gedruckt wird, wenn Sie puts object tun, wenn Sie die to_s Methode in der Objektklasse außer Kraft setzen

+1

Dies ist nicht die tatsächliche Stelle auf Antwort. –

0

In Rails, wenn #select Methode verwenden, auch wenn Sie nicht id in select Methodenargumente verwenden, wird es Zeigen Sie es, weil in Rails standardmäßig Primärschlüssel id ist. Wenn Sie den Primärschlüssel oder etwas anderes überschreiben, wird diese Spalte angezeigt. Schauen Beispiel:

Coupon.select(:active) 
# Coupon Load (0.6ms) SELECT "coupons"."active" FROM "coupons" 
# => #<ActiveRecord::Relation [#<Coupon active: true, code: nil>, #<Coupon active: true, code: nil>... 

Dies liegt daran, in meinem Coupon Modell I Primärschlüsselsatz code haben.

class Coupon < ActiveRecord::Base 
    self.primary_key = 'code' 
    # .. 
end 

Obwohl es in der zeigt sich inspizieren Ergebnis, es bis nicht vorhanden ist, können Sie es wirklich zu holen. Jetzt, wenn Sie die self.primary_key = '' zum Testen einrichten, werden Sie sehen, dass #select nichts zeigt. Aber setzen Sie nicht Ihre primary_key auf '' wie ich, um die id Anzeige von select Ergebnis zu entfernen. Ich wollte nur zeigen, woher es kommt, sonst nichts.

Coupon.select(:active).order(:active) 
# Coupon Load (2.8ms) SELECT "coupons"."active" FROM "coupons" ORDER BY "coupons"."active" ASC 
# => #<ActiveRecord::Relation [#<Coupon active: true>, #<Coupon active: true>... 
+0

Das Problem ist, dass ich diesen Primärschlüssel entlang der Anwendung brauche, aber in diesem speziellen Fall brauche ich Rückkehr und Array mit der WHERE-Bedingung, aber dieses Ergebnis enthält nicht das ID-Feld –

+0

@GonzaloPincheiraArancibia Es zeigt nur die 'ID' in der Inspektion nach oben, aber das tatsächliche Ergebnis hat nicht den 'ID'-Wert. –