04
Jul 08
 

array.collect {|item| block } → an_array
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.

publicado por dessa às 21:22
sinto-me: um zumbi

Hey!  Ficou faltando saber como implementar herança no rails, mas o Bruno me explicou na terça o que eu já tinha entendido antes quaseee certo:  

 

Eu posso ter um modelo chamado Animal, que referencia uma tabela com todoosss os campos/atribuitos de animais¹, incluindo um campo type:string. Não preciso gerar o scaffold aqui pq não vou precisar das views nem dos controllers, então gero apenas o model.

Depois, posso gerar scaffolds para Animal Selvagem e para Animal Domestico, sendo que no model de cada um eu coloco que eles herdam de Animal. Aí pronto! Insiro as validações e edito as views, para exibir apenas o que é conveniente a cada um.

 

Ah, o código que faltou no outro post foi este:

<%= f.select :carac, Objeto.find(:all).map { |o| [o.titulo,o.carac_tecnica.id] }, :include_blank => true %>

 

 

Depois eu coloco alguma coisa falando sobre o método map do Ruby. Aliás, lançaram a sua versão 1.8.7.  eustaquiorangel.com/posts/528 Só passei os olhos, depois eu vou ler direito..

 

¹: Single Table Inheritance

 

publicado por dessa às 01:46

Julho 2008
Dom
Seg
Ter
Qua
Qui
Sex
Sab

1
2
3
4
5

6
7
8
9
10
11
12

13
14
15
16
17
19

20
21
22
23
24
25
26

27
28
29
30
31


subscrever feeds
pesquisar
 
Subscrever por e-mail

A subscrição é anónima e gera, no máximo, um e-mail por dia.

blogs SAPO