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
4

2 に答える 2

1

ハッシュを配列に変更したいだけですか?その場合はto_a、ハッシュのメソッドを使用してください。

hash = {:a => "something", :b => "something else"}
array = hash.to_a
array.inspect #=> [[:a, "something"], [:b, "something else"]]
于 2012-10-22T17:46:00.493 に答える
0

Rubyでhash['key']からhash.keyのようなものを探しているようです

ハッシュクラスはデフォルトで表記をサポートしていません.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
于 2012-10-22T19:26:24.260 に答える