Возвратите атрибут объекта из массива объектов в Ruby - PullRequest
0 голосов
/ 10 января 2011

Я пытаюсь создать новый хэш из атрибутов объекта из массива объектов. Я использую API Amazon через гем ruby ​​aaws, и у меня возникают проблемы с выяснением того, как перебрать массив, возвращаемый API, чтобы он содержал только атрибуты, а не весь массив. Когда я запускаю приведенный ниже код, он возвращает весь массив.

   def self.amazon(search)
    keywords = "#{search}"
    resp = Amazon::AWS.item_search('Books', { 'Title' => keywords })
    items = resp.item_search_response[0].items[0].item
    items.each do |attribs|
      a = attribs.item_attributes
      @results = []
      @results << {:label => "#{a.title.to_s[0,85] unless a.title.nil?}",
                 :value => "#{a.title.to_s unless a.title.nil?}",
                 :img => "#{attribs.medium_image.url.to_s unless attribs.medium_image.url.nil?}"""
                }

     end
   end

Мне нужно изменить цикл, но я не уверен точно, где я не прав.

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Метод each возвращает массив, с которым он работал - в данном случае items.Похоже, вы хотите вернуть @results, вместо этого.Вы также, похоже, инициализируете @results обратно на [] на каждом проходе.Перемещение @results = [] за пределы цикла и добавление явного return @results или (более идиоматически) просто @results после того, как ваш цикл должен сделать свое дело.

Возможно, вы захотите взглянуть на метод map, хоть.С его помощью вы можете просто сделать это:

@results = items.map do |attribs|
  a = attribs.item_attributes
  {:label => "#{a.title.to_s[0,85] unless a.title.nil?}",
   :value => "#{a.title.to_s unless a.title.nil?}",
   :img => "#{attribs.medium_image.url.to_s unless attribs.medium_image.url.nil?}"
  }
end

Это должно установить вашу переменную и также вернуть ее, если это последний оператор в методе.(Я предполагаю, что вам нужно установить @results позже - если вы этого не сделаете, вы можете оставить это полностью.)

0 голосов
/ 10 января 2011

Вы можете избежать создания переменной @results, которую вам нужно явно вернуть, используя метод Enumerable # map, что-то вроде этого:

items.map do |attribs|
  a = attribs.item_attributes
  {:label => "#{a.title.to_s[0,85] unless a.title.nil?}",
             :value => "#{a.title.to_s unless a.title.nil?}",
             :img => "#{attribs.medium_image.url.to_s unless attribs.medium_image.url.nil?}"
  }
end

Enumerable # map возвращает массив возвращаемых значений выполнения поставляемого блока для каждого элемента в принимающем массиве. Так что если в вашем оригинальном методе вы хотите вернуть @results, вам лучше использовать map.

Между прочим, даже если вы поместите return @results в конец метода в том виде, в каком он есть, он даст только атрибуты, вычисленные на последней итерации цикла, поскольку вы сбрасываете @results в [] каждый раз, когда Блок называется. Вы можете избежать этого, инициализируя @results в [] перед циклом или полностью избегая использования map.

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