2012-08-16 6 views
39

Ich möchte einem vorhandenen Modell einige Attribute hinzufügen, die nicht persistent bleiben müssen, oder sogar einer Datenbankspalte zugeordnet werden müssen. Gibt es eine Lösung, um so etwas zu spezifizieren?Nicht persistente ActiveRecord-Modellattribute

+0

Mögliches Duplikat von [Zusätzliche Laufzeitattribute zu einem ActiveRecord-Objekt hinzufügen] (http://StackOverflow.com/questions/7584592/Adding-ExtraRun-Time-Attribs-Toan-ActiveRecord-Object) – mlt

Antwort

48

Natürlich gute alte Rubine verwenden attr_accessor. In Ihrem Modell:

attr_accessor :foo, :bar 

können Sie tun:

object.foo = 'baz' 
object.foo #=> 'baz' 
+14

Wie erhält man dieses Attribut im JSON-Format des Objekts? Ich möchte, dass dieses Attribut im JSON des Objekts auf der Clientseite erscheint. Werde ich es bekommen? ab sofort bekomme ich es nicht, obwohl ich dies in meiner create-Methode eingestellt habe. Wie es geht? – Yash

+0

Und in Schienen 4? – monteirobrena

+1

@monteirobrena gleiche Sache – apneadiving

26

ich das gleiche Problem hatte, aber ich brauchte das Modell Bootstrap, so das Attribut musste anhalten, nachdem to_json genannt wurde . Sie müssen eine zusätzliche Sache dafür tun.

Wie apneadiving erwähnt, ist der einfachste Weg, um zu starten zu Ihrem Modell gehen und hinzufügen:

attr_accessor :foo 

Dann können Sie die Attribute zuweisen können Sie wollen. Aber um das Attribut zu halten, müssen Sie die Attributsmethode ändern. Fügen Sie in Ihrer Modelldatei diese Methode hinzu:

1

In meinem Fall wollte ich eine linke Verknüpfung verwenden, um benutzerdefinierte Attribute zu füllen. Es funktioniert, wenn ich nichts hinzufüge, aber ich möchte auch das Attribut auf ein neues Objekt setzen können und natürlich existiert es nicht. Wenn ich attr_accessor hinzufüge, gibt es immer nil nach einem select zurück. Hier ist der Ansatz, den ich am Ende habe, der für das Setzen neuer Objekte und das Abrufen vom linken Join funktioniert.

after_initialize do 
    self.foo = nil unless @attributes.key?("foo") 
end 

def foo 
    @attributes["foo"] 
end 

def foo=(value) 
    @attributes["foo"] = value 
end 
+0

Funktioniert nicht mehr in Rails 4.2. '@ attributes' ist jetzt ein' ActiveRecord :: AttributeSet', das '[]' aber nicht '[] =' unterstützt. – davogones

5

Falls sich jemand fragt sich, wie diese in die Ansicht zu machen, die Methode Argumente für die Methode machen verwenden, etwa so:

render json: {results: results}, methods: [:my_attribute] 

Bitte beachten Sie, dass dies nur funktioniert, wenn Sie die attr_accessor eingestellt auf Ihrem Modell und setzen Sie das Attribut in der Controller-Aktion, wie die ausgewählte Antwort erklärt.