Forum: Rails-ES Acceder a campos dentro de un hash de array

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-12 11:20
Hola, estamos realizando una pequeña aplicacion que permitira comparar
distintos depositos (de los cuales el usuario introducira las
caracteristicas) con uno que la empresa promociona y cuyos datos de
tiempo, cantidad de dinero, seran iguales que el ultimo introducido por
el usuario. Los valores que diferiran sera el TAE y cualquier otro
propio de este deposito.

El usuario puede comparar tantos depositos como quiera ya que estos
datos se almacenaran en una cokkie durante un dia. Los datos se
visualizaran en una tabla, la columna de mas a la izquierda no tendra
cabecera y contendra el nombre de los datos que se muestran: dinero a
invertir, durancion,TAE, interes bruto, interes neto, importe de
vencimiento. Despues las otras columnas mostraran en la cabecera
Simulacion n (siendo n el numero de la simulacion que ese usuario ha
realizado durante ese dia) y en la columan apareceran los datos
correspondientes para esa simulacion en concreto. Finalmente la columna
de mas a la derecha tendra como cabecera Nuestro deposito y en la
columna se mostraran los datos para ese deposito en concreto.

Bueno, pues hasta aqui la descipcion del problema (gracias si a partir
de la 6 linea habis decidido continuar ;) ). La implementacion que
tenemos hasta ahora (pruebas) es la siguinte

Contolador:
************

class SimuladorController < ApplicationController
  def depositos
#Simulacion recoge los datos del form
    simulacion = { :nombre => 'Simulación 1', :dinero_a_invertir =>
params[:dinero], :duracion => params[:tiempo], :tae => params[:TAE] }
#promo es la promocion que se ofrece, el campo tae es fijo de la
promocion y los demas son iguales que los datos que introduce el usuario
para poder realizar la comparacion
    promo = { :nombre => 'Depósito Azul', :dinero_a_invertir =>
params[:dinero], :duracion => params[:tiempo], :tae => 3.50 }
#Creamos un vector para almacenar los datos, donde cada elemento del
vector es un hash
    simulaciones = [simulacion, promo]

  end

Vista: Me centro en la matriz que se debe de generar para mostrar los
resultados
********

.
.
.
<h2>Comparativa de resultados</h2>
<div id="ranking">
table class="tabla" summary="resultados">
    <%# Tedran que haber tantas columnas de simulacion como veces se
pulse el boton calcular a lo largo del dia,
    recordad que las anteriores simulaciones se guardan en cookies y
 deben salir%>
      <% ths( [''] +  )  %>


El primer problema lo encontramos al intentar crear el titulo de cada
columna, si lo quisieramos meter a "piñon" no tendriamos problema,
ahriamos algo como:
 <% ths( Simulacion1 Simulacion 2 simulacion3 Deposito azul )  %> .
Pero claro esto no es posible, lo que me interesa es poder acceder al
campo nombre de cada elemento del vector que esta dentro del hash...pero
no se como :(.

Alguien puede ayudarnos a introducir el nombre de las columans con este
metodo?
5c15703984caa012845b3cea129da936?d=identicon&s=25 Manuel González Noriega (Guest)
on 2009-05-12 11:55
(Received via mailing list)
2009/5/12 Jose vicente Ribera pellicer
<ruby-forum-incoming@andreas-s.net>

> #Simulacion recoge los datos del form
>    simulacion = { :nombre => 'Simulación 1', :dinero_a_invertir =>
> params[:dinero], :duracion => params[:tiempo], :tae => params[:TAE] }
>


Alguien puede ayudarnos a introducir el nombre de las columans con este
> metodo?


Dudo mucho haberte entendido bien, pero si lo que pasa es que tienes un
array de simulaciones, cada una de estas es un hash, y quieres recoger
el
valor de la clave "nombre" de cada simulacion

col_nombres = simulaciones.map {|s| s[:nombre] }
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-12 12:26
>
> Dudo mucho haberte entendido bien, pero si lo que pasa es que tienes un
> array de simulaciones, cada una de estas es un hash, y quieres recoger
> el
> valor de la clave "nombre" de cada simulacion
>
> col_nombres = simulaciones.map {|s| s[:nombre] }


Me entendiste perfectamente. Gracias por la aclaracion estaba intentando
hacer cosas estilo:

@simulaciones.each do |info|
info["nombre"]
end

pero no habia forma....
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-12 14:39
Os comento...hems tenido que tirar marcha atras  en nuestro
planteamisnto. Para poder almacenar los datos que el usuario ya habia
introducido usabamos las cookies. El problema es que las cookies solo
permiten almacenar elementos dentro de un vector y como lo que nosotros
teniamos era un vector compuesto por
hashes mostraba un error gsub

(Mirar el apartado de Aguile web development sobre las cookies para ams
informacion).

Hemos replanteado la forma de reolverlo introduciendo un modelo para
evitar el vector de hashes.

Bueno, pues eso gente informaros que las cookies solo las podemos usar
con vectores.

S2
3ffa9da11160026e0d78ef9735bdcdda?d=identicon&s=25 Pablo Martinez Schroder (Guest)
on 2009-05-12 15:43
(Received via mailing list)
> El problema es que las cookies solo
> permiten almacenar elementos dentro de un vector y como lo que nosotros
> teniamos era un vector compuesto por
> hashes mostraba un error gsub

Puestos a guardar en las cookies, guardad como dato de sesión y ya está ¿no?
--
Pablo Martinez Schroder
http://docecosas.com
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-12 20:25
>
> Puestos a guardar en las cookies, guardad como dato de sesi�n y ya est� �no?
>


Queremos que los usuarios que no esten registrados tengan acceso
a la funcionalidad
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-05-13 00:16
(Received via mailing list)
2009/5/12 Jose vicente Ribera pellicer
<ruby-forum-incoming@andreas-s.net>

> Bueno, pues eso gente informaros que las cookies solo las podemos usar
> con vectores.
>

En las cookies se guarda la sesión serializada, y en ruby, se puede
serializar muchos objetos, entre ellos el Hash (creo que es un hash
cuando
hablas de vector).
Puedes usar un helper para manejarlo

def current_preferences
  Marshal.load(session[:preferences])
end

def current_preferences=(val)
  session[:preferences] = Marshal.dump(val)
end

Y con eso serializas casi todo.

Recuerda que la cookie tiene un tamaño maximo, si no cabe... te petará,
así
que cuidado con lo que guardas. Un color de la página, algo sencillito y
pequeño. Lo demás no debería de ir en la sesión.

Un Saludo.
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2009-05-13 17:21
Guillermo wrote:
> 2009/5/12 Jose vicente Ribera pellicer
> <ruby-forum-incoming@andreas-s.net>
>
>> Bueno, pues eso gente informaros que las cookies solo las podemos usar
>> con vectores.
>>
>
> En las cookies se guarda la sesión serializada, y en ruby, se puede
> serializar muchos objetos, entre ellos el Hash (creo que es un hash
> cuando
> hablas de vector).
> Puedes usar un helper para manejarlo
>
> def current_preferences
>   Marshal.load(session[:preferences])
> end
>
> def current_preferences=(val)
>   session[:preferences] = Marshal.dump(val)
> end
>
> Y con eso serializas casi todo.
>
> Recuerda que la cookie tiene un tamaño maximo, si no cabe... te petará,
> así
> que cuidado con lo que guardas. Un color de la página, algo sencillito y
> pequeño. Lo demás no debería de ir en la sesión.
>
> Un Saludo.

Finalmente opte por hacerlo como comente antes, pero muchas gracias. Es
interesante saber como poder hacer estas cosas...quien sabe lo que
tocara hacer amñana.

S2
3bad218882602f4c35ea15adb3e5d5a4?d=identicon&s=25 Fernando Calatayud (fernan2)
on 2009-05-19 14:38
Guillermo wrote:
> En las cookies se guarda la sesión serializada, y en ruby, se puede
> serializar muchos objetos, entre ellos el Hash (creo que es un hash
> cuando
> hablas de vector).
> Puedes usar un helper para manejarlo
>
> def current_preferences
>   Marshal.load(session[:preferences])
> end
>
> def current_preferences=(val)
>   session[:preferences] = Marshal.dump(val)
> end
>
> Y con eso serializas casi todo.


¿Sabéis si hay algún equivalente para hacer un volcado en un formato más
legible, en vez de un stream de bytes? Es para un volcado a logs, he
hecho esto:

RAILS_DEFAULT_LOGGER.info Marshal.dump("hash: #{my_hash}")

Y se lee mejor que sin el Marshal.dump, pero peor que cuando lo muestras
con un raise inspect...

s2
3bad218882602f4c35ea15adb3e5d5a4?d=identicon&s=25 Fernando Calatayud (fernan2)
on 2009-05-19 14:41
Fernando Calatayud wrote:
>
> ¿Sabéis si hay algún equivalente para hacer un volcado en un formato más
> legible, en vez de un stream de bytes? Es para un volcado a logs, he
> hecho esto:
>
> RAILS_DEFAULT_LOGGER.info Marshal.dump("hash: #{my_hash}")
>
> Y se lee mejor que sin el Marshal.dump, pero peor que cuando lo muestras
> con un raise inspect...
>
> s2

Que tontería... yo sólo me he contestado: RAILS_DEFAULT_LOGGER.info
"hash: #{my_hash.inspect}"
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-05-19 17:05
(Received via mailing list)
2009/5/19 Fernando Calatayud <ruby-forum-incoming@andreas-s.net>

> "hash: #{my_hash.inspect}"
>

Si, pero inspect te devuelve un string a título informativo, no
serializado,
por lo que no lo puedes des-serializar.

Si quieres serializar en un formato más legible, tienes yaml.

irb(main):004:0> YAML.load( {:a => 3, :b => 'hola'}.to_yaml )
=> {:a=>3, :b=>"hola"}
This topic is locked and can not be replied to.