Tengo el siguiente objeto que ha sido creado
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
Una vez guardado esto, quiero poder devolver el objeto a un hash, por ejemplo, haciendo algo como:
@object.to_hash
¿Cómo es esto posible desde los rieles?
ruby-on-rails
ruby
ben morgan
fuente
fuente
.to_json
consultará DB si el modelo no está completojoins
yselect
,Person.joins(:address).select("addresses.street, persons.name").find_by_id(id).attributes
regresará{ street: "", name: "" }
as_json
, llamará a loserializable_hash
que, a su vez, llamaráattributes
. Por lo tanto, su consejo es agregar dos capas de complejidadattributes
, lo que lo hace aún más costoso..as_json
serializará el objeto a ruby hashEn la versión más reciente de Rails (aunque no puedo decir cuál exactamente), puede usar el
as_json
método:Saldrá:
Para ir un poco más lejos, puede anular ese método para personalizar la apariencia de sus atributos, haciendo algo como esto:
Luego, con la misma instancia que la anterior, generará:
Por supuesto, esto significa que debe especificar explícitamente qué atributos deben aparecer.
Espero que esto ayude.
EDITAR:
También puedes consultar la gema Hashifiable .
fuente
as_json tiene una forma muy flexible de configurar objetos complejos de acuerdo con las relaciones del modelo
EJEMPLO
La campaña modelo pertenece a la tienda y tiene una lista
La lista de modelos tiene muchas list_tasks y cada una de list_tasks tiene muchos comentarios
Podemos obtener un json que combina todos esos datos fácilmente.
Métodos de aviso : las etiquetas pueden ayudarlo a adjuntar cualquier objeto adicional que no tenga relaciones con otros. Solo necesita definir un método con etiquetas de nombre en la campaña modelo . Este método debería devolver lo que necesite (por ejemplo, Tags.all)
Documentación oficial de as_json
fuente
to_
variante parece funcionar casi exactamente igual que laas_
variante, excepto por el resultado citado. Lo único que no me gustó fue no preservar el orden de mis criterios de filtro. Parece estar ordenado alfabéticamente. Pensé que estaba relacionado con la gema awesome_print que tengo en mi entorno, pero no creo que ese sea el caso.Puede obtener los atributos de un objeto modelo devueltos como un hash utilizando
o
as_json
le permite incluir asociaciones y sus atributos, así como especificar qué atributos incluir / excluir (consulte la documentación ). Sin embargo, si solo necesita los atributos del objeto base, la evaluación comparativa en mi aplicación con ruby 2.2.3 y rails 4.2.2 demuestra queattributes
requiere menos de la mitad de tiempoas_json
.fuente
Aquí hay algunas sugerencias geniales.
Creo que vale la pena señalar que puede tratar un modelo ActiveRecord como un hash de esta manera:
Por lo tanto, en lugar de generar un hash de los atributos, puede usar el propio objeto como un hash.
fuente
Definitivamente podría usar los atributos para devolver todos los atributos, pero podría agregar un método de instancia a Post, llamarlo "to_hash" y hacer que devuelva los datos que desea en un hash. Algo como
fuente
No estoy seguro de si eso es lo que necesita, pero intente esto en la consola ruby:
obviamente te devolverá un hash en la consola. si desea devolver un hash desde un método, en lugar de simplemente "h", intente usar "return h.inspect", algo similar a:
fuente
Mi solución:
fuente
La respuesta de Swanand es genial.
Si está utilizando FactoryGirl, puede utilizar su
build
método para generar el hash de atributo sin la claveid
. p.ejfuente
Antigua pregunta, pero muy referenciada ... Creo que la mayoría de la gente usa otros métodos, pero de hecho hay un
to_hash
método, debe configurarse correctamente. En general, desplumar es una mejor respuesta después de los rieles 4 ... respondiendo esto principalmente porque tuve que buscar un montón para encontrar este hilo o algo útil y asumiendo que otros están enfrentando el mismo problema ...Nota: ¡no recomiendo esto para todos, sino casos extremos!
Desde el api ruby on rails ... http://api.rubyonrails.org/classes/ActiveRecord/Result.html ...
fuente