Kaminari y Willpaginate, manipulación de resultados paginados me trae problemas

23 views
Skip to first unread message

Emanuel Friedrich

unread,
Jul 23, 2016, 11:12:59 AM7/23/16
to rub...@googlegroups.com, La lista sobre Ruby On Rails (rubyonrails.com) en castellano, rubyco...@googlegroups.com
Hola, como están?

Estoy usando api-pagination para paginar un api.

Tanto con will-paginate como con kaminari tengo un mismo inconveniente. 

Cuando hago:

def search
  @objects = paginate Object.search_objects(params)
  @objects = filtrar_no_activos
  render json: @objects
end

def filtrar_no_activos
  @objects.select  {|o| o.activo?}
end

Tratando de filtrar en memoria los objetos (porque los criterios son complejos), ya la paginación se vuelve loca. A tal nivel que solo la primera pagina tiene resultados de un total de 5 paginas.

Si alguien me puede decir el porqué, genial.
Y si me dicen como puedo encarar el problema, mejor.

Saludos

Rodrigo Pavano

unread,
Jul 23, 2016, 11:40:36 AM7/23/16
to rub...@googlegroups.com, La lista sobre Ruby On Rails (rubyonrails.com) en castellano, rubyco...@googlegroups.com
Hola Emanuel, 

No te recomiendo filtrar los objetos en memoria, deberías poder hacerlo en el query a la DB directamente. Para entender por qué no está funcionando la búsqueda usando la gema deberíamos conocer más de los detalles de la búsqueda, y ver si la gema ofrece el tipo de filtro que buscás, y si es así, si lo estás usando correctamente. De todas maneras, si vas a hacer la búsqueda manualmente sin usar una gema, te recomiendo organizar el código de tal manera que el filtro lo hagas usando la interfaz de ActiveRecord (where, limit, join, etc). De esta manera el filtrado lo hace la db, y te evitas cargar todos los objetos en memoria y filtrarlos después.

Saludos!

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Rodrigo Pavano

unread,
Jul 23, 2016, 12:12:11 PM7/23/16
to rub...@googlegroups.com, La lista sobre Ruby On Rails (rubyonrails.com) en castellano, rubyco...@googlegroups.com

Hola Emanuel, me acaba de caer la ficha, y creo saber cual es el problema.

WillPaginate y Kaminari son gemas que te ayudan a paginar simplemente. La funcionalidad de búsqueda o filtro la deberías implementar vos, o usar otra gema en su defecto. Si activo es un campo de tu modelo, podrías hacer lo siguiente por ejemplo (Kaminari):

Object.where(activo: true).page(params[:page])

Saludos!

Emanuel Friedrich

unread,
Jul 23, 2016, 7:45:17 PM7/23/16
to rub...@googlegroups.com
Hola Rodrigo, gracias.

activo? no es una propertie del modelo, es un método. Se que son gemas de paginación solamente.

En mi search del modelo hago consultas basadas en cercanía, basadas en texto y en otras cosas más. y las pagino. Se supone que debería retornar por cada página la cantidad de objetos de la pagina, en mi caso 25. Y de esos 25 objetos filtro los que no están activos.... activo? implica pagar una suscripción y si el perfil (objeto sería el perfil de un usuario) fue moderado y aprobado...

En principio es un poco laboriosa ya la consulta, en parte hecha pragmática, con metodos de ActiveRecord y en parte con wheres con sql... Y pensaba que esta funcionalidad sería complejo llevarla a una query más... Y si bien pensando un poco podría llegar a colocar la funcionalidad de este metodo activo? en la query sql, ya estoy bastante complicado con la query actual. 

Mi embole viene del, para mi, irracional problema que estoy teniendo. Si tengo 25 objetos que pasa que si los filtro luego la paginación se rompe así.

si quito esta linea

@objects = filtrar_no_activos

la cosa se normaliza. A esto voy

Gracias desde ya, y creo que voy a incursionar con esto de meter todo en la query. Y para la proxima quizás pagino a mano y punto. 




--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Emanuel Friedrich 

Cel: 3754-442896

Rodrigo Pavano

unread,
Jul 24, 2016, 12:48:21 AM7/24/16
to rub...@googlegroups.com
Hola Emanuel! 

Según entiendo entonces simplemente querés paginar un Array de objetos. Kaminari se que ofrece esta funcionalidad. Sino podés hacerlo manualmente usando el método brackets pero pasándole un range. Por ejemplo `array[5...10]` devuelve 5 elementos arrancando desde el quinto. 

Saludos!

Ricardo Luis Mender

unread,
Aug 9, 2016, 2:05:54 PM8/9/16
to rub...@googlegroups.com
Buenas, y podrias usar un scope para sacar los activos primeros? en vez de paginar primero.

Saludos

Ricardo Luis Mender

El 24 de julio de 2016, 1:48, Rodrigo Pavano <rodrig...@gmail.com> escribió:
Hola Emanuel! 

Según entiendo entonces simplemente querés paginar un Array de objetos. Kaminari se que ofrece esta funcionalidad. Sino podés hacerlo manualmente usando el método brackets pero pasándole un range. Por ejemplo `array[5...10]` devuelve 5 elementos arrancando desde el quinto. 

Saludos!
El sáb., 23 de jul. de 2016 a la(s) 20:45, Emanuel Friedrich <aemanuel...@gmail.com> escribió:
Hola Rodrigo, gracias.

activo? no es una propertie del modelo, es un método. Se que son gemas de paginación solamente.

En mi search del modelo hago consultas basadas en cercanía, basadas en texto y en otras cosas más. y las pagino. Se supone que debería retornar por cada página la cantidad de objetos de la pagina, en mi caso 25. Y de esos 25 objetos filtro los que no están activos.... activo? implica pagar una suscripción y si el perfil (objeto sería el perfil de un usuario) fue moderado y aprobado...

En principio es un poco laboriosa ya la consulta, en parte hecha pragmática, con metodos de ActiveRecord y en parte con wheres con sql... Y pensaba que esta funcionalidad sería complejo llevarla a una query más... Y si bien pensando un poco podría llegar a colocar la funcionalidad de este metodo activo? en la query sql, ya estoy bastante complicado con la query actual. 

Mi embole viene del, para mi, irracional problema que estoy teniendo. Si tengo 25 objetos que pasa que si los filtro luego la paginación se rompe así.

si quito esta linea

@objects = filtrar_no_activos

la cosa se normaliza. A esto voy

Gracias desde ya, y creo que voy a incursionar con esto de meter todo en la query. Y para la proxima quizás pagino a mano y punto. 




El 23 de julio de 2016, 12:12, Rodrigo Pavano <rodrig...@gmail.com> escribió:

Hola Emanuel, me acaba de caer la ficha, y creo saber cual es el problema.

WillPaginate y Kaminari son gemas que te ayudan a paginar simplemente. La funcionalidad de búsqueda o filtro la deberías implementar vos, o usar otra gema en su defecto. Si activo es un campo de tu modelo, podrías hacer lo siguiente por ejemplo (Kaminari):

Object.where(activo: true).page(params[:page])

Saludos!

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Emanuel Friedrich 

Cel: 3754-442896

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages