Quiero agregar a un modelo existente algunos atributos que no necesitan persistir, ni siquiera asignarse a una columna de base de datos. ¿Hay alguna solución para especificar tal cosa?Atributos del modelo de ActiveRecord no persistentes
Respuesta
Por supuesto, use good old ruby's attr_accessor
. En su modelo:
attr_accessor :foo, :bar
podrás hacer:
object.foo = 'baz'
object.foo #=> 'baz'
¿Cómo obtener este atributo en el formato JSON del objeto? Diga, quiero que este atributo aparezca en el JSON del objeto en el lado del cliente. ¿Lo conseguiré? a partir de ahora no lo estoy obteniendo, aunque configuré esto en mi método de creación. ¿Cómo hacerlo? – Yash
¿Y en Rails 4? – monteirobrena
@monteirobrena lo mismo – apneadiving
que estaba teniendo el mismo problema pero necesitaba para arrancar el modelo, por lo que el atributo tenido que persistir después fue llamado a_json . Necesitas hacer algo extra para esto.
Como señaló apneadiving, la forma más fácil de empezar es ir a su modelo y añadir:
attr_accessor :foo
A continuación, puede asignar los atributos que desee. Pero para hacer que el atributo se adhiera, debes cambiar el método de los atributos. En su archivo de modelo, agregue este método:
def attributes
super.merge('foo' => self.foo)
end
En mi caso, quería utilizar una combinación izquierda para completar el atributo personalizado. Funciona si no agrego nada, pero también quiero poder establecer el atributo en un nuevo objeto y, por supuesto, no existe. Si agrego attr_accessor
, siempre devuelve nil
después de select
. Este es el enfoque con el que he terminado que funciona para establecer un nuevo objeto y recuperarlo de la combinación de la izquierda.
after_initialize do
self.foo = nil unless @attributes.key?("foo")
end
def foo
@attributes["foo"]
end
def foo=(value)
@attributes["foo"] = value
end
Ya no funciona en Rails 4.2. '@ attributes' ahora es un' ActiveRecord :: AttributeSet' que admite '[]' pero no '[] ='. – davogones
En caso de que alguien se pregunta cómo hacen esto a la vista, utilizar los argumentos del método para el método render, así:
render json: {results: results}, methods: [:my_attribute]
por favor sepa que esto sólo funciona si se establece la attr_accessor en su modelo y establezca el atributo en la acción del controlador, como se explicó en la respuesta seleccionada.
- 1. Escriba un atributo virtual del modelo ActiveRecord
- 2. Actualizar los atributos del modelo
- 3. Rails ordenar entradas basadas en los atributos del modelo relacionado
- 4. Obtener atributos del modelo en el Backbone.js
- 5. Rails Desacoplamiento del modelo de dominio de Activerecord
- 6. Ruby on Rails - atributos anidados: ¿Cómo accedo al modelo padre del niño modelo
- 7. Rails consulta activerecord comparar dos atributos del mismo registro
- 8. Reemplazando los nombres de los atributos del modelo usando I18n - no puedo hacer que esto funcione
- 9. nombres de columna Actualizar en la clase del modelo ActiveRecord
- 10. ActiveRecord - reemplace el error de validación del modelo con advertencia
- 11. Cómo obtener la lista de atributos de un modelo activerecord que puede asignarse en masa
- 12. reemplazar los métodos de atributos ActiveRecord
- 13. Rieles - Agregar atributos que no están en el modelo y actualizar el atributo del modelo
- 14. Rails ActiveRecord - Buscar en varios atributos
- 15. ¿Por qué before_save no se llama para mi modelo ActiveRecord?
- 16. agregando variables no persistentes a nsmangedobject
- 17. ¿Cómo configuro atributos en un objeto ActiveRecord antes de guardarlo?
- 18. backbone.js establece los atributos internos del modelo hash directamente
- 19. ¿Cómo se descubren los atributos del modelo en Rails
- 20. Rails anidados con has_many: a través de, ¿cómo editar los atributos del modelo join?
- 21. Agregando atributos a la clase meta del modelo Django
- 22. Convertir una relación ActiveRecord :: en un modelo
- 23. Tengo ActiveRecord :: AssociationTypeMismatch en el modelo save
- 24. Obteniendo los tipos de los atributos en un objeto ActiveRecord
- 25. Encontrar atributos personalizados en las propiedades del modelo de vista cuando se vincula el modelo
- 26. ¿Devolución de llamada para los atributos modificados de ActiveRecord?
- 27. Recuperar todos los atributos de asociación de un modelo AR?
- 28. ¿Agregar más atributos a una serialización de ActiveRecord?
- 29. Rieles 3: ¿Cómo validar que A <B donde A y B son atributos del modelo?
- 30. Rails 3 ActiveRecord carga ansiosa del alcance
Posible duplicado de [Agregar atributos at-run adicionales a un objeto activerecord] (http://stackoverflow.com/questions/7584592/adding-extra-run-time-attribs-to-an-activerecord-object) – mlt