Include array asociativo

Hola lista, estoy intentando comprobar si un array contiene un valor. Lo
normal es:
array= {a,b,c}
array.include?(‘a’)

Pero mi array es un array de hashes, podría hacer alguna chapucilla pero
seguro que se puede hacer simple pero me he hecho un lio:

Mi array:
[#<Tagging id: 28, tag_id: 26, taggable_id: 17, taggable_type:
“Documento”, created_at: “2008-09-05 11:33:09”>, #<Tagging id: 29,
tag_id: 27, taggable_id: 17, taggable_type: “Documento”, created_at:
“2008-09-05 11:33:09”>, #<Tagging id: 30, tag_id: 24, taggable_id: 17,
taggable_type: “Documento”, created_at: “2008-09-05 11:33:09”>]

Cómo puedo decirle si este array contiene el tag_id 24 por ejemplo? No
digo que me lo resolveis, si alguno lo hace se lo agradezco, si me
podeis aconsejar también, gracias

On Fri, Sep 5, 2008 at 12:26, Miguel Angel Calleja L.
[email protected] wrote:

Hola lista, estoy intentando comprobar si un array contiene un valor. Lo
normal es:
array= {a,b,c}
array.include?(‘a’)

Una cosilla, las llaves {} no definen un array, definen un hash,
aunque esa sintaxis no se si funcionaría para definir un hash. Si
quieres que ese pequeño codigo funcione debería ser:

array = [‘a’, ‘b’, ‘c’]

o

array = %w(a b c)

Pero mi array es un array de hashes, podría hacer alguna chapucilla pero
seguro que se puede hacer simple pero me he hecho un lio:

Mi array:
[#<Tagging id: 28, tag_id: 26, taggable_id: 17, taggable_type:
“Documento”, created_at: “2008-09-05 11:33:09”>, #<Tagging id: 29,
tag_id: 27, taggable_id: 17, taggable_type: “Documento”, created_at:
“2008-09-05 11:33:09”>, #<Tagging id: 30, tag_id: 24, taggable_id: 17,
taggable_type: “Documento”, created_at: “2008-09-05 11:33:09”>]

Y de nuevo, eso no es un “array de hashes”. Hasta donde yo llego es un
array de objetos Tagging.

Cómo puedo decirle si este array contiene el tag_id 24 por ejemplo? No
digo que me lo resolveis, si alguno lo hace se lo agradezco, si me
podeis aconsejar también, gracias

Si ya tienes el array de esa forma, deberías mirar el método find de
Enumerable (Array tiene todos los métodos de Enumerable disponibles):
http://apidock.com/ruby/Enumerable/find. Dentro del bloque podrías
comprobar el tag_id de cada objeto Tagging. Si no encuentra uno con el
id buscado devolvería nil.

De todas formas, si ese Array viene de una asociación en un objeto
ActiveRecord puedes utilizar find sobre la asociación para tener más
condiciones de busqueda, como que el tag_id sea uno concreto (si vas a
reutilizar esas condiciones en diferentes partes del código lo ideal
sería crear un named_scope).

Suerte.

Hola,

Pero mi array es un array de hashes, podría hacer alguna chapucilla pero
seguro que se puede hacer simple pero me he hecho un lio:

en realidad no es un areray de hashes, sino un array de objetos AR por
lo que parece. Creo que te vale con

tu_array.map(&:tag_id).include?(loquebusques)

aunque lo mismo en este caso es más eficiente un

tu_array.find{|x| x.tag_id == loquebusques}

y en una sola vuelta ya lo encuentras

no me cansaré (bueno, en realidad me acabaré cansando, porque van dos
veces en la última semana) de recomendar el API de Array, Hash y
Enumerable. De verdad, dedicad un ratillo a eso… que le vais a sacar
rentabilidad

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

javier ramirez
escribió:>

saludos,

Gracias Javier, es lo primero que he hecho, ir a la class Array y Hash,
pero bueno, me he liado al usar map e include y no sabía muy bien cómo
hacerlo por éso recurrí aquí. Ya de paso me anoto ese método find, ya no
me volverá a pasar. Gracias muchas

Cómo puedo decirle si este array contiene el tag_id 24 por ejemplo? No
digo que me lo resolveis, si alguno lo hace se lo agradezco, si me
podeis aconsejar también, gracias

find al rescate. Los Array son Enumerable, que incluyen funciones como
find/detect y find_all/select y en este caso bastaría con find.

http://www.ruby-doc.org/core/classes/Enumerable.html

De memoria:

array.find { |c| c.id == 24 }

Devuelve el objeto encontrado o nil si no encuentra. Y si lo vas a usar
en
un par de sitios, podrías incluirlo en la clase Array para el futuro, algo
como:

class Array
def include_with(&cond)
return !self.find(&cond).nil?
end
end

[1,2,3,4,5].include_with { |d| d==3 } => true
[1,2,3,4,5].include_with { |d| d==7 } => false

Y con tu array sería:

array.include_with { |c| c.id==24 }

Incluso podrías especializarlo algo más para que fuera include_with_id(24)
pero eso se deja como ejercicio para el lector :wink:


Pablo M. Schroder
http://docecosas.com