JavaFree.org | RubyOnBr.org

Dúvida Hash

Acompanhar Dúvida Hash 18 posts, 7 participantes

Avatar Renato Japs 18 posts

Aew galera, olha eu de novo só incomodando rs..Estou com uma dúvida no rails agora,recebi o xml e converti pra hash nos controllers, como eu faço pra selecionar só alguns campos desse hash para salvar no banco?

 
Avatar Matheus Caceres 2 posts

Se é para trabalhar com XML tente usar o nokogiri mais facil.

 
Avatar Douglas (dorô) 142 posts

Como está o seu hash ou xml? Coloca ai para brincarmos…

[]’s

 
Avatar Shairon Toledo 1428 posts
 
Avatar Renato Japs 18 posts

O xml está assim

<?xml version="1.0" encoding="UTF-8"?>
<ResponseAcessorioVeiculo>
<AcessorioVeiculo>
<veiID>1</veiID> 
<acvID>23</acvID> 
</Veiculo>
<Veiculo>
<veiID>2</veiID> 
<acvID>433</acvID> 
</Veiculo>
<Veiculo>
<veiID>21</veiID> [int]
<acvID>232</acvID> [int]
</Veiculo>
</AcessorioVeiculo>
</ResponseAcessorioVeiculo>

O hash prefiro não por aqui pq na verdade esse xml tem umas 300 linhas, então eu consigo salvar a primeira linha no banco, mas o resto não consigo, como faço o loop que controle isso.

 
Avatar Renato Japs 18 posts

Não está saindo o xml aqui, puz um espaço na frente de cada um pra sair agora, mas então utilizando o hash só consigo salvar na primeira linha, se alguem tiver algum exemplo e puder me ajudar ai agradeço.

<?xml version="1.0" encoding="UTF-8"?>
< ResponseAcessorioVeiculo>
< AcessorioVeiculo>
< veiID>#</veiID> [int]
< acvID>#</acvID> [int]
< /AcessorioVeiculo>
< AcessorioVeiculo>
< veiID>#</veiID> [int]
< acvID>#</acvID> [int]
< /AcessorioVeiculo>
< AcessorioVeiculo>
< veiID>#</veiID> [int]
< acvID>#</acvID> [int]
< /AcessorioVeiculo>
< /ResponseAcessorioVeiculo>
 
Avatar Shairon Toledo 1428 posts

use tag pre

 
Avatar Douglas (dorô) 142 posts

@Shairon, qual a versão do ruby que você está utilizando? Aqui o seu exemplo não funcionou.

Eu consigo chegar nesse resultado:


>> h.select{|k,v| c.include? k}
=> [[:c, 3], [:a, 1]]

Não consigo transformar em Hash, só se eu faço isso:

>> Hash[:c, 3, :a, 1]
=> {:c=>3, :a=>1}

Estou usando esse:

$ruby -v
ruby 1.8.6 (2008-08-11 patchlevel 287)

Será que estou “batendo a nave” em algum lugar?

 
Avatar Mereghost 1476 posts

Dorô:

Chama um flatten depois do teu select que deve resolver o problema e gerar o hash da maneira que o Shairon falou.

 
Avatar Douglas (dorô) 142 posts

@mereghost,

Fiz um teste rápido aqui e não foi tbm. Qndo chegar em casa vou brincar mais um pouco.

>> h.select{|k,v| c.include? k}.flatten
=> [:c, 3, :a, 1]

Valeu.

 
Avatar Mereghost 1476 posts

Então… passa pro Hash.new esse call.

 
Avatar Douglas (dorô) 142 posts

@merefhost,

Desse jeito não vai bro, olha ai:


>> h = {:a => 1, :b => 2, :c => 3, :d => 4}
=> {:c=>3, :a=>1, :d=>4, :b=>2}
>> c = [:a, :c]
=> [:a, :c]
>> h.select{|k,v| c.include? k}.flatten
=> [:c, 3, :a, 1]
>> Hash[h.select{|k,v| c.include? k}.flatten]
ArgumentError: odd number of arguments for Hash
from (irb):15:in `[]’
from (irb):15
from ♥:0
>>

O array vai como um único parâmetro. Tem como mostrar na prática =]

abs,

 
Avatar rrsilva 181 posts
>> h = { :a => 1, :b => 2, :c => 3, :d => 4 }
=> {:b=>2, :c=>3, :d=>4, :a=>1}
>> c = [:a, :c]
=> [:a, :c]
>> h.select{|k,v| c.include? k}.flatten
=> [:c, 3, :a, 1]
>> Hash[h.select{|k,v| c.include? k}.flatten]
=> {}
>> Hash[*h.select{|k,v| c.include? k}.flatten]
=> {:c=>3, :a=>1}
>> 

Faltou o asterisco =)

 
Avatar Douglas (dorô) 142 posts

@rrsilva, com o asterisco vai na boa, mas do outro jeito que parece ter funcionado para o @shairon e @mereghost, não rola aqui.

Pode explicar o que o asterisco fez exatamente?

 
Avatar nofxx 1960 posts

Splat! Das mioh coisa q a teno… ;)

 
Avatar Douglas (dorô) 142 posts

Pode crer, já tinha visto isso em um coding dojo que participei.

alguma coisa assim:

Só achei bem diferente a forma como foi usado no Has[*h].

Legal. Valeu!

 
Avatar nofxx 1960 posts

Vdd, eh comum em argumentos de metodo.
Porem eh uma puta mao na roda, uso sempre.

Um uso por ex eh lambda, suponha um named_scope:

named_scope :some, lambda { |*args| …… }

 
Avatar Douglas (dorô) 142 posts

Não costumo usar, acho que preciso pensar mais no jeito ruby de fazer as coisas =]

vlw