如何将数据收集从哈希更改为数组?

时间:2012-10-22 17:21:01

标签: ruby-on-rails ruby nokogiri

现在我从另一个网址获取数据... 这是我的代码:

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

2 个答案:

答案 0 :(得分:1)

您是否只想将哈希值更改为数组?如果是这样,只需在哈希上使用to_a方法。

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

答案 1 :(得分:0)

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

这样的东西

Hash类默认情况下不支持.key表示法,OpenStruct会从Hash创建一个Object,因此您可以使用点表示法来访问属性。总的来说,它基本上只是具有开销的语法糖。

建议的代码(来自链接的答案)

>> 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&amp; collect(它们是相同的),但这只是基本语义差异的一个小的分离,虽然我通常只使用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