Desidero aggiungere a un modello esistente alcuni attributi che non devono essere persistenti o mappati su una colonna di database. Esiste una soluzione per specificare tale cosa?Attributi del modello ActiveRecord non persistente
risposta
Ovviamente usare il buon vecchio rubino attr_accessor
. Nel modello:
attr_accessor :foo, :bar
Sarete in grado di fare:
object.foo = 'baz'
object.foo #=> 'baz'
Come ottenere questo attributo nel formato JSON dell'oggetto? Supponiamo, voglio che questo attributo appaia nel JSON dell'oggetto sul lato client. Lo prenderò? per ora non lo capisco, anche se ho impostato questo nel mio metodo di creazione. Come farlo? – Yash
E in Rails 4? – monteirobrena
@monteirobrena stessa cosa – apneadiving
ho avuto lo stesso problema, ma avevo bisogno di bootstrap del modello, in modo l'attributo dovuto persistere dopo to_json è stato chiamato . Devi fare una cosa in più per questo.
Come affermato dal apneadiving, il modo più semplice per iniziare è quello di andare al modello e aggiungere:
attr_accessor :foo
Quindi è possibile assegnare gli attributi desiderati. Ma per mantenere l'attributo stick è necessario cambiare il metodo degli attributi. Nel file del tuo modello aggiungi questo metodo:
def attributes
super.merge('foo' => self.foo)
end
Nel mio caso volevo utilizzare un join sinistro per popolare l'attributo personalizzato. Funziona se non aggiungo nulla ma voglio anche essere in grado di impostare l'attributo su un nuovo oggetto e ovviamente non esiste. Se aggiungo attr_accessor
, restituisce sempre nil
dopo un select
. Ecco l'approccio con cui ho finito che funziona per l'impostazione di un nuovo oggetto e il recupero dal join sinistro.
after_initialize do
self.foo = nil unless @attributes.key?("foo")
end
def foo
@attributes["foo"]
end
def foo=(value)
@attributes["foo"] = value
end
Non funziona più in Rails 4.2. '@ attributes' è ora un' ActiveRecord :: AttributeSet' che supporta '[]' ma non '[] ='. – davogones
Nel caso in cui qualcuno si sta chiedendo come rendere questo per la vista, utilizzare gli argomenti del metodo per il metodo di rendering, in questo modo:
render json: {results: results}, methods: [:my_attribute]
Si prega di sapere che questo funziona solo se si imposta l'attr_accessor sul modello e impostare l'attributo nell'azione del controller, come spiegato dalla risposta selezionata.
- 1. Ottieni attributi specifici da un modello ActiveRecord
- 2. Ottenere attributi del modello backbone.js
- 3. Richiamata per attributi ActiveRecord modificati?
- 4. Rails ActiveRecord - Ricerca su più attributi
- 5. Persistente vs non persistente - Quale dovrei usare?
- 6. nomi delle colonne Aggiornare in ActiveRecord classe del modello
- 7. L'override dei lettori di attributi del modello non influisce sui campi di input simple_form
- 8. ActiveRecord - sostituire l'errore di convalida del modello con avviso
- 9. Come ottenere l'elenco degli attributi di un modello activerecord che può essere assegnato in serie
- 10. Come si crea un valore predefinito per gli attributi nel modello di Rails activerecord?
- 11. Rails - Aggiungere attributi non nel modello e aggiornare l'attributo del modello
- 12. modello di generazione con associazioni ActiveRecord
- 13. SharedPreferences non persistente
- 14. Sessione Express non persistente
- 15. Aggiornamento errato non persistente
- 16. ActiveRecord non aggiorna i dati
- 17. backbone.js che accede agli attributi del modello all'interno del modello - this.attribute VS this.get ('attribute')?
- 18. Ruby on Rails - attributi nidificati: Come faccio ad accedere al modello di genitore da bambino modello
- 19. Come si scoprono gli attributi del modello in Rails
- 20. HTML5 Archiviazione locale non persistente
- 21. Tasti dinamici JBuilder per gli attributi del modello
- 22. Come si crea un cookie persistente o non persistente?
- 23. Rails ordina le voci in base agli attributi del modello correlato
- 24. Query activerecord Rails confrontando due attributi dello stesso record
- 25. raccolta backbone ordinamento basata sugli attributi del modello
- 26. Come rimuovere gli spazi bianchi dagli attributi del modello?
- 27. Scorciatoia per prelevare due attributi da un oggetto ActiveRecord?
- 28. Aggiunta di ulteriori attributi a una serializzazione ActiveRecord?
- 29. Modulo annidato di rails con has_many: through, come modificare gli attributi del modello di join?
- 30. Rails 3: Come convalidare A <B dove A e B sono entrambi attributi del modello?
Possibile duplicato di [Aggiunta di attributi di runtime aggiuntivi a un oggetto activerecord] (http://stackoverflow.com/questions/7584592/adding-extra-run-time-attribs-to-an-activerecord-object) – mlt