Acceder a campos dentro de un hash de array


#1

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 :wink: ). 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


.
.
.

Comparativa de resultados

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?


#2

2009/5/12 Jose vicente Ribera pellicer
removed_email_address@domain.invalid

#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] }


#3

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…


#4

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 M. Schroder
http://docecosas.com


#5

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


#6

2009/5/12 Jose vicente Ribera pellicer
removed_email_address@domain.invalid

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.


#7

Guillermo wrote:

2009/5/12 Jose vicente Ribera pellicer
removed_email_address@domain.invalid

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


#8

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


#9

Fernando C. 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}”


#10

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


#11

2009/5/19 Fernando C. removed_email_address@domain.invalid

“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”}