Как я могу получить доступ к хешам в массиве? - PullRequest
5 голосов
/ 27 апреля 2011

Я пытаюсь использовать Nokogiri, чтобы получить некоторые данные из файла XML, а затем сохранить их в базе данных.

Код, который я использую:

def self.import_from_feed(feed)
 doc = Nokogiri::XML(open(feed))

 @products = doc.xpath('/merchantProductFeed/merchant/prod').map do |i| 
   {
     'name' => i.xpath('text/name').inner_text,
     'link' => i.xpath('uri/mLink').inner_text, 
     'description' => i.xpath('text/desc').inner_text,
     'price' => i.xpath('price/buynow').inner_text
   }
 end
end

В консоли Rails я запустил Products.import_from_feed(myfeedgoeshere) и получил:

[{"price"=>"8.00", "name"=>"BASIC GIRL BOXER", "description"=>"Boxer shorts Elasticated waist with Bench logo Button fly", "link"=>"http://www.bench.co.uk/womenswear/underwear/basic-girl-boxer/GY001X/"}, {"price"=>"10.00", "name"=>"CMTL  PK SPORTY SOCKS", "description"=>"Ankle sockBench logo on sole of each sockContrasting stripe around ankle", "link"=>"http://www.bench.co.uk/womenswear/underwear/cmtl03593-3-pk-sporty-socks/BK014-SK034/"}, {"price"=>"12.00", "name"=>"A PK STRING UNDERWEAR", "description"=>"Plain thong Bench logo along waistband Bench tag on front", "link"=>"http://www.bench.co.uk/womenswear/underwear/a4771-3pk-string-underwear/PK023-BK001-WH001/"}, {"price"=>"8.00", "name"=>"BASIC GIRL BOXER", "description"=>"Boxer shorts Elasticated waist with Bench logo Button fly", "link"=>"http://www.bench.co.uk/womenswear/underwear/basic-girl-boxer/WH001/"}, {"price"=>"45.00", "name"=>"OSPREY TRAINER", "description"=>"Lace up trainers Bench logo on tongue and back of heelBench logo on end of trainer", "link"=>"http://www.bench.co.uk/menswear/footwear/osprey-trainer/WH001-BL081/"}, {"price"=>"45.00", "name"=>"OSPREY TRAINER", "description"=>"Lace up trainers Bench logo on tongue and back of heelBench logo on said of trainer", "link"=>"http://www.bench.co.uk/menswear/footwear/osprey-trainer/WH001-GR128/"}, {"price"=>"90.00", "name"=>"META TRENCH", "description"=>"Vintage look leather bootLace upFabric sidesPull on tab on heel", "link"=>"http://www.bench.co.uk/womenswear/footwear/meta-trench/BK001/"}]
(^ Truncated)

Может кто-нибудь сказать мне, как я могу получить доступ к элементам массива? Цикл, чтобы я мог получить @products.price, @products.description и т. Д.

Редактировать: я пытался @products[0], products[0], я пытался напечатать пары ключ / значение без удачи.

Я не прошу вас делать всю работу, я думаю, что здесь есть несколько концепций - достаточно, чтобы я бился в кирпичные стены.

Часть 2: Дополнительный кредит!

Исходя из выбранного ответа, это должно сработать, верно?

 @products.each do |h|
   h.save
 end

Я получаю:

NoMethodError: undefined method `save' for #<Hash:0x10388c7d8>

Ответы [ 3 ]

4 голосов
/ 27 апреля 2011

Поскольку каждый элемент @products является хешем, вы можете сделать это:

@products.each do |h|
  puts "#{h['price']}, #{h['description']}"
end
2 голосов
/ 27 апреля 2011

Это не проверялось, но похоже, что у вас есть массив хэшей, поэтому сначала выполните цикл по массиву:

@products.each do |product_hash|

Затем для каждого элемента (и каждый элемент является хешем),получите нужные элементы: product_hash[:price] или product_hash.price

@products.each do |product_hash|
#Do something with the price
product_hash[:price]
#Do other things...
end
1 голос
/ 16 января 2013

Если вы хотите сохранить эти значения в таблице базы данных, скажем, Product, то просто сделайте, как показано ниже:

@products.each do |product|
    prod = Product.new
    prod.name = product["name"]
    prod.price = product["price"]
    prod.description = product["description"] 
    prod.save
end

вы получили ошибку в отношении ключевого слова save, поскольку вы не выполняли никаких операций над базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...