Buscar um ou mais objetos em um array de objetos em Ruby

Criado em: 16/02/2013

Como fariamos para conseguir pegar um objeto de um array de objetos baseado em uma propriedade do objeto?

Vamos ao seguinte cenário, dado que tenhamos o seguinte array de OpenStructs, utilizamos OpenStruct pela facilidade mas poderia ser qualquer objeto ou mesmo um Hash.

require 'ostruct'

games = [
  OpenStruct.new(
    id: 53,
    name: "Gears of War",
    gender: "action"
  ),
  OpenStruct.new(
    id: 54,
    name: "Uncharted",
    gender: "action"
  )
]

Se quisessemos apenas o objeto com o id 53, poderiamos usar o Enumerable#select que nos retornaria:

puts games.select { |g| g.id == 53 } # => [#<OpenStruct id=53, name="Gears of War", gender="action">]

como pode ver o select nos retorna uma coleção, sendo assim ele retorna todos os objetos que satisfazerem a condição passada ao bloco, veja o exemplo a seguir:

puts games.select { |g| g.gender == 'action' } # => [#<OpenStruct id=53, name="Gears of War", gender="action">, #<OpenStruct id=54, name="Uncharted", gender="action">]

Como temos 2 objetos com o gender igual a action ele retornou os 2. Caso queiramos apenas o primeiro objeto que satisfazer a condição, o que faz sentido no caso de uma busca por id por exemplo, podemos utilizar o Enumerable#detect veja:

puts games.detect { |g| g.id == 53 } # => #<OpenStruct id=53, name="Gears of War", gender="action">

Então fica a dica precisando buscar em uma coleção, uma coleção de objetos que satisfaçam uma certa condição utilizar o select, precisando retornar um único valor que satisfaça a condição utilizar o detect.

RSpec: Crie especificações executáveis em Ruby
Aprimore as suas habilidades enquanto escreve testes com o meu livro RSpec: Crie especificações executáveis em Ruby

Comentários

Comentários powered by Disqus