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
Antwort
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'
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
Und in Schienen 4? – monteirobrena
@monteirobrena gleiche Sache – apneadiving
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:
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
Funktioniert nicht mehr in Rails 4.2. '@ attributes' ist jetzt ein' ActiveRecord :: AttributeSet', das '[]' aber nicht '[] =' unterstützt. – davogones
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.
- 1. Persistente Benachrichtigung
- 2. AppFabric zeigt mir nicht die persistente Instanz
- 3. Persistente Datenstrukturen in Scala
- 4. Android HttpClient persistente Cookies
- 5. Persistente Festplatte Größe reduzieren
- 6. Persistente Daten ohne Referenz
- 7. Persistente Referenzen in Python
- 8. Persistente Sitzungen in Meteor
- 9. Persistente Benutzerauthentifizierung Firebase Swift
- 10. NLB und persistente Verbindungen
- 11. openshift persistente Volumes
- 12. Persistente Windows in PyGTK
- 13. Hibernate - Persistente polymorphe Joins
- 14. JavaScript persistente Variable
- 15. Persistente benutzerdefinierte Objekte
- 16. Persistente Graph-Daten (Java)
- 17. Reagieren: persistente Speicheroptionen?
- 18. Yesod Persistente atomare Interaktion
- 19. Was würden Sie eine nicht persistente Datenstruktur nennen, die persistente Operationen erlaubt?
- 20. Mysqli persistente Verbindung
- 21. Persistente Gruppe mit XMPP
- 22. Wie persistente Cookie setzen
- 23. Persistente Datenstrukturen in C++
- 24. C++ persistente Daten
- 25. Persistente Datenbankverbindung in C
- 26. Persistente Klassenliterale in Objectify
- 27. Persistente Thumbnails mit PIcasso
- 28. Grails validateable nicht für nicht-persistente Domain-Klasse arbeiten
- 29. Wo speichert ElasticSearch persistente Einstellungen?
- 30. Persistente Konsole Geschichte in Ghci
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