2012-10-22 28 views
0

从另一个URL现在我取数据... 这里是我的代码:如何将数据从散列更改为数组?

require 'rubygems' 
    require 'nokogiri' 

    html = page.body 

    doc = Nokogiri::HTML(html) 
    doc.encoding = 'utf-8' 

    rows = doc.search('//table[@id = "MainContent_GridView1"]//tr') 
     @details = rows.collect do |row| 
      detail = {} 
      [ 
      [:car, 'td[1]/text()'], 
      [:article, 'td[2]/text()'], 
      [:group, 'td[3]/text()'], 
      [:price, 'td[4]/text()'], 
      ].each do |name, xpath| 
      detail[name] = row.at_xpath(xpath).to_s.strip 
      end 
      detail 
     end 
    @details 

我试图通过数组来做到这一点,而不是一个哈希值。但我收到很多错误... 有什么想法吗? 我需要它的另一种方法...

也是我在这里可以设置另一辆车的数据(该结果哈希):

oem_art = [] 
    @constr_num.each do |o| 
     as_oem = get_from_as_oem(o.ARL_SEARCH_NUMBER) 
     if as_oem.present? 
     oem_art << as_oem 
     end 
    end  

    @oem_art = oem_art.to_a.uniq 
+0

那你试试,什么是错误?向我们展示您遇到问题的代码,而不是适用的代码。 –

+0

@AlexWayne如果你知道如何解决,然后写它...简单的改变细节{}为[]和做detail.car =“td [1] /文本()”...这就是我尝试 – byCoder

+0

我需要它像standart一样操作:@ lala.each do | lala | lala.name等...但现在我有多个记录的麻烦,并且需要写lala [:name],当我使用散列--PavelBY 28分钟前 – byCoder

回答

1

你只需要换一个散列到一个数组?如果是这样,只需在散列上使用to_a方法即可。

hash = {:a => "something", :b => "something else"} 
array = hash.to_a 
array.inspect #=> [[:a, "something"], [:b, "something else"]] 
+0

我需要它在视图中运行,如标准:@lala .each do | lala | lala.name等...但现在我有多个记录的麻烦,并需要写lala [:名字],当我使用散列 – byCoder

+0

增加了编辑与<< – byCoder

+0

也如果我写= lol [1] [:汽车]我得到的结果,但只有第二个记录 – byCoder

0

它看起来像你正在寻找类似hash['key'] to hash.key in Ruby

哈希类不支持.key符号默认情况下,OpenStruct创建从哈希的对象,所以你可以使用点符号来访问属性。总的来说,它基本上只是含有开销的语法糖。

建议代码(从链接答案)

>> require 'ostruct' 
=> [] 
>> foo = {'bar'=>'baz'} 
=> {"bar"=>"baz"} 
>> foo_obj = OpenStruct.new foo 
=> #<OpenStruct bar="baz"> 
>> foo_obj.bar 
=> "baz" 

所以,在你的榜样,你可以这样做:

# Initialised somewhere 
require 'ostruct' 
DETAIL_INDICES = { 
    :car => 1, 
    :article => 2, 
    :group => 3, 
    :price => 4, 
} 

# ** SNIP ** 
@details = rows.map do |row| 
    DETAIL_INDICES.inject({}) do |h,(k,v)| 
    h.merge(k => row.at_xpath("td[#{v}]/text()").to_s.strip) 
    end 
end.collect { |hash| OpenStruct.new hash } 

@details.each do |item| 
    puts item.car 
end 

当然,如果性能是可以合并地图&收集关心(他们虽然我通常只使用map来保持一致性,所以请随意选择自己:)

编辑 - 从编辑附加代码简化

@oem_art = @constr_num.select do |item| 
    as_oem = get_from_as_oem(item.ARL_SEARCH_NUMBER) 
    as_oem.present? 
end 

puts @oem_art.uniq 
+0

嗯,不明白你的意思(((如果我试图写,没有任何改变大声笑[:汽车]我得到像这样的东西:无法将符号转换为字符串 – byCoder

+0

添加了编辑内容<< – byCoder

+0

您希望我澄清哪部分内容?当您说'没有更改'时,您指的是什么代码,在此页面上没有看到名为'lol'的变量的代码? – Rym