Forum: Rails-ES Problema con ordenacion 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.
Jose Antonio P. (Guest)
on 2008-12-11 13:40
 Hola a todos,

 Tengo un problema respecto a la ordenacion de un array. Se que esto
tendría que ir en el foro de Ruby, pero les cuento la situacion.
 Tengo un array que lo obtengo de la siguiente forma:

 @incidences = Incidence.find(:all, :conditions => "user_id =
#{@user.id} OR
            assigned_to = #{@user.id}")
 @historial = Array.new
 for x in @incidences
   for y in x.records
     @historial << y
   end
 end

 Teoricamente el array @historial no debe estar ordenado, salvo por el
orden de entrada de los elementos. Pero en la vista al recorrerlo, me
los muestra ordenados según el id (o la fecha de creacion).
 Me gustaria dale otra ordenacion. Para ello he probado el sort_by y el
sort, de mil maneras y no lo ha ordenado. ¿Alguien me puede dar una
pista?

 Gracias!
javier ramirez (Guest)
on 2008-12-11 13:50
(Received via mailing list)
hola,
>  Me gustaria dale otra ordenacion. Para ello he probado el sort_by y el
> sort, de mil maneras y no lo ha ordenado. ¿Alguien me puede dar una
> pista?
>

a falta de saber qué ordenación quieres y en qué fallaban las mil
maneras que has probado, puedes ordenar aleatoriamente cualquier array
con

mi_array.sort_by{rand}

suerte

--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
Jose Antonio P. (Guest)
on 2008-12-11 13:55
 Una de las ordenaciones que le he querido aplicar ha sido:

 @historial.sort_by{|x| x[:incidence_id]}

 Y se ha quedado igual. También he probado el que me acabas de comentar,
y tampoco me lo ordena de forma aleatoria.

 Para recorrerlo hago utilizo un for

 for x in @historial, por dar mas informacion.


javier ramirez wrote:

> a falta de saber qué ordenación quieres y en qué fallaban las mil
> maneras que has probado, puedes ordenar aleatoriamente cualquier array
> con
>
> mi_array.sort_by{rand}
>
> suerte
>
> --
> javier ramírez
>
> ..i do ruby on rails development in madrid, spain, at
> http://www.aspgems.com
> ..you can find out more about me on http://formatinternet.wordpress.com
> and http://workingwithrails.com/person/5987-javier-ramirez
javier ramirez (Guest)
on 2008-12-11 14:08
(Received via mailing list)
>  @historial.sort_by{|x| x[:incidence_id]}
>
> for x in @historial, por dar mas informacion.
>

vale.. te lo ordena bien.. lo que pasa es que sort_by no afecta al array
original, sino que te devuelve un array ordenado, pero el original sigue
igual

si cambias lo de arriba por

@historial=@historial.sort_by{|x| x[:incidence_id]}

for x in @historial, por dar mas informacion.

ya debería estar.

no sé de memoria si hay algún sort que afecte al original y que te pueda
ahorrar la asignación, pero si no te valdría esto.


saludos,



--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
Jose Antonio P. (Guest)
on 2008-12-11 14:36
Pues algo estoy o está haciendo mal porque no hay forma. Si hago esto:

 @historial = Array.new
 for x in @incidences
   for y in x.records
     @historial << y
   end
 end
 @historial2 = Array.new
 @historial2 = @historial.sort_by{|x| x[:incidence_id]}

 Y cuando intento hacer en la vista:

 for x in @historial2
  ...

 me dice:

 You have a nil object when you didn't expect it!

 Es decir, que en @historial2 no hay nada.


> @historial=@historial.sort_by{|x| x[:incidence_id]}
>
> for x in @historial, por dar mas informacion.
Andrés G. (Guest)
on 2008-12-11 14:43
(Received via mailing list)
@historial2 = @historial.sort_by{|x| x[:incidence_id]}

Por qué no pruebas a hacer lo mismo pero con @incidences:

@historial2 = @incidences.sort_by{|x| x[:incidence_id]}

El día 11 de diciembre de 2008 13:36, Jose Antonio P.
<removed_email_address@domain.invalid>
escribió:> Pues algo estoy o está haciendo mal porque no hay forma. Si hago 
esto:
Jose Antonio P. (Guest)
on 2008-12-11 14:55
 Tampoco funciona. El fallo tiene que estar en el metodo. No hay forma
de que funcione!

Andrés Gutiérrez wrote:
> @historial2 = @historial.sort_by{|x| x[:incidence_id]}
>
> Por qu� no pruebas a hacer lo mismo pero con @incidences:
>
> @historial2 = @incidences.sort_by{|x| x[:incidence_id]}
>
> El d�a 11 de diciembre de 2008 13:36, Jose Antonio P.
> <removed_email_address@domain.invalid>
> escribi�:> Pues algo estoy o est� haciendo mal porque no hay forma. Si hago esto:
Isaac Feliu Pérez (Guest)
on 2008-12-11 14:55
(Received via mailing list)
Tal vez me salgo por la tangente pero....

porque no hacerlo en una sola SQL y desde el principio? Sin conocer
los modelos de datos, yo creo que lo que buscas es algo como:

@historial =
Record.find_all_by_incidence_id(Incidence.find(:all, :select =>
'id', :conditions => ["user_id = ? OR assigned_to = ?", @user.id,
@user.id]).map(&:id), :order => 'incidence_id')

Si no lo he entendido mal, claro. Esto busca todos los "Incidence" del
usuario y luego busca todos los "Record" de estos incidence ordenando
por incidence_id y te lo devuelve en un array.

** Nota, no he probado el codigo de arriba por no tener los modelos,
etc.. pero deberia funcionar tal cual o con algun "parche". :P

Salutaciones,
--
Isaac Feliu
Jose Antonio P. (Guest)
on 2008-12-12 09:31
 Funciona perfectamente.
 He de pedir disculpas porque todo lo indicado con anterioridad funciona
también. El despiste me ha jugado una mala pasada y estaba buscando el
error en un find que no era.

 Gracias a todos!!!!!


Isaac Feliu Pérez wrote:
> Tal vez me salgo por la tangente pero....
>
> porque no hacerlo en una sola SQL y desde el principio? Sin conocer
> los modelos de datos, yo creo que lo que buscas es algo como:
>
> @historial =
> Record.find_all_by_incidence_id(Incidence.find(:all, :select =>
> 'id', :conditions => ["user_id = ? OR assigned_to = ?", @user.id,
> @user.id]).map(&:id), :order => 'incidence_id')
>
> Si no lo he entendido mal, claro. Esto busca todos los "Incidence" del
> usuario y luego busca todos los "Record" de estos incidence ordenando
> por incidence_id y te lo devuelve en un array.
>
> ** Nota, no he probado el codigo de arriba por no tener los modelos,
> etc.. pero deberia funcionar tal cual o con algun "parche". :P
>
> Salutaciones,
> --
> Isaac Feliu
This topic is locked and can not be replied to.