Ruby on rails 从Ruby中的对象数组返回对象属性

Ruby on rails 从Ruby中的对象数组返回对象属性,ruby-on-rails,loops,Ruby On Rails,Loops,我试图从一个对象数组中创建一个新的对象属性散列。我正在通过ruby aaws gem使用AmazonAPI,我很难弄清楚如何循环API返回的数组,这样它将只返回属性,而不是整个数组。当我运行下面的代码时,它返回整个数组 def self.amazon(search) keywords = "#{search}" resp = Amazon::AWS.item_search('Books', { 'Title' => keywords }) items = re

我试图从一个对象数组中创建一个新的对象属性散列。我正在通过ruby aaws gem使用AmazonAPI,我很难弄清楚如何循环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
def self.amazon(搜索)
关键词=“#{search}”
resp=Amazon::AWS.item_search('Books',{'Title'=>keywords})
items=resp.item\u search\u response[0]。items[0]。item
项目。每个项目都有|属性|
a=attribs.item\u属性
@结果=[]
@结果“#{a.title.to_s[0,85],除非a.title.nil?}”,
:value=>“#{a.title.to_s,除非a.title.nil?}”,
:img=>“#{attribs.medium_image.url.to_s,除非attribs.medium_image.url.nil?}”
}
结束
结束

我需要修改循环,但我不确定我到底错在哪里

each方法返回它所操作的数组——在本例中是
。看起来您希望返回@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,如果不需要,您可以完全忽略它。)

您可以避免创建@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来避免这种情况