array.map {|item| block } → an_array
Invokes block once for each element of self. Creates a new array containing the values returned by the block. See also Enumerable#collect.
a = [ "a", "b", "c", "d" ]
a.collect {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"]
a #=> ["a", "b", "c", "d"]
Retirado de: www.ruby-doc.org/core-1.8.6/index.html
Ou seja, o método .map do Ruby invoca um bloco de comandos para cada elemento do array, sem modificar estes elementos (ele cria um novo array com os valores retornados pelo bloco). Se quiser que ele substitua os valores "antigos" pelos "novos", é só usar .map!.
Ahm, fiz uma coisa bem interessante hoje e sem nenhuma ajuda direta! usuhs
Bem, eu já tinha resolvido esse problema antes, com a ajuda do Bruno, mas agora eu dei uma mudada na solução. Depois tenho que saber se isso está certo..
Bem, em contribuições do ciclo de vida, eu tinha que exibir o nome do objeto. Só que a estrutura é assim:
Objeto has_one ciclo_vida ciclo_vida has_many ciclo_contribuicao
ciclo_vida belongs_to objeto ciclo_contribuicao belongs_to ciclo_vida
No formulário de ciclo_contribuicao, tenho que selecionar a qual ciclo de vida ele pertence. Para isso, eu preciso exibir o nome do objeto de cada ciclo_vida existente. Mas eu só posso exibir os objetos que possuem ciclo_vida. Então eu analisei o código que o bruno me ensinou, li essa descrição do .map e tentei adaptar. O código inicial era:
<%= f.select :ciclo_vida_id, Objeto.find(:all).map { |o| [o.titulo,o.ciclo_vida.id] }, :include_blank => true %>
Mas eu tinha que colocar uma condição, para apenas exibir os objetos que tinham ciclo de vida, pq desse jeito dá erro.. Alias tenho que corrigir em requisitos tb. Depois que eu pensei um pouco, resolvi definir os métodos no helper:
def ciclos
CicloVida.all.map {|a| a.objeto_id }
end
# pego todos os ids dos objetos que possuem ciclo de vida.
def objetos_com_ciclo
Objeto.find(:all, :conditions => {:id => ciclos}).map {|objeto| [objeto.titulo, objeto.ciclo_vida.id]}
end
E na view:
<%= f.select :ciclo_vida_id, objetos_com_ciclo, :include_blank => true %>
Prontoooooooo
Funciona!
Quando souber se isso tá teoricamente certo eu aviso aqui.