Problema con ordenacion de Array


#1

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!


#2

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


#3

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


#4

@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


#5

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.


#6

@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:


#7

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:


#8

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”. :stuck_out_tongue:

Salutaciones,

Isaac Feliu


#9

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”. :stuck_out_tongue:

Salutaciones,

Isaac Feliu