Acceso a elementos contiguos en un hash

Buenas, en una vista necesito implementar una minipaginación a medida de
manera que se pueda avanzar a la vista del siguiente objeto o ir a la
anterior, algo parecido a un album de fotos, cuando estás en la vista de
una
foto puedes ir a la siguiente o a la anterior. Para hacer esto meto en
un
hash todos los elementos que tienen que aparecer en la paginacion, pero
no
encuentro la manera de poder acceder al siguiente o al anterior. tengo
esto:
Controlador de “projects”, metodo show
def show
@project = Project.find(params[:id])
@projects = @category.projects.find(:all,:order => ‘created_at
desc’)
respond_to do |format|
format.html
end
end

Paso el hash @projects para poder avanzar o retroceder, en la vista me
gustaria hace algo como

@projects[@project].next o @projects[@project].previous y así poder
acceder
a los elementos contiguos.

Alguna sugerencia?

Gracias.

Hola,

gustaria hace algo como
En realidad @projects no es un hash, sino un Array. Si fuera un Hash no
tendrías forma de conseguir el anterior o el siguiente porque una hash
por definición no mantiene un orden determinado y al añadir/eliminar
elementos te cambiaría el orden de una vez para otra.

En el caso de un Array, puedes usar el método index para saber en qué
posición está un elemento determinado. Para ir hacia atrás, con restarle
menos uno siempre tendrás la posición del anterior (incluso aunque estés
al inicio, por aquello de que -1 equivale al último). En el caso de ir
al siguiente sería comprobar si estás al final de la lista y en ese caso
ir al 0, o si no sumar uno. Si no tienes elementos nulos, siempre
podrías implementar esto.

class Array
def previous(elem)
self[index(elem) -1] rescue nil
end
def next(elem)
self[index(elem) + 1] || self[0] rescue nil
end
end

Con eso tus arrays tendrían un método previous y next dado un elemento
determinado. Si no lo quieres genérico para cualquier Array, puedes usar
la misma idea ajustándola a tu caso.

Y por último, en tu código veo que haces un primer find para encontrar
un proyecto, y un segundo find para encontrar una lista de proyectos
entre los que está el tuyo. Ahí estás lanzando dos queries diferentes
cuando sólo con la segunda ya tienes todo lo que quieres. Si sobre el
resultado de la segunda query haces un

@[email protected]{|p| p.id == params[:id]}

obtienes el mismo resultado, pero ahorrándote una query… y poco a poco
rails va escalando :wink:

un saludo,

javier ramírez

Gracias Javier, he estado haciendo pruebas en la consola mientras
esperaba
una respuesta y me he dado cuenta de que no era un hash sinó un Array.
Importante lo de eliminar querys, es mi “obsesión” :slight_smile:

Gracias.

El día 19/03/08, javier ramirez [email protected] escribió: