2012-07-14 48 views
0

下面是一个例子散列(每个查询最多10个)解析散列数组?

 
parsed_response = [{"id"=>3, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/mobile-4", "name"=>"Mobile", "type"=>"MarketTag"}, {"id"=>12, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/enterprise-software", "name"=>"Enterprise Software", "type"=>"MarketTag"}, {"id"=>10, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/saas", "name"=>"SaaS", "type"=>"MarketTag"}, {"id"=>841, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/software", "name"=>"Software", "type"=>"MarketTag"}, {"id"=>263, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/restaurants-2", "name"=>"Restaurants", "type"=>"MarketTag"}, {"id"=>376, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/productivity-software", "name"=>"Productivity Software", "type"=>"MarketTag"}, {"id"=>942, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/embedded-hardware-and-software", "name"=>"Embedded Hardware and Software", "type"=>"MarketTag"}, {"id"=>291, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/meeting-software", "name"=>"Meeting Software", "type"=>"MarketTag"}, {"id"=>13764, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/hardware-software", "name"=>"Hardware + Software", "type"=>"MarketTag"}, {"id"=>2983, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/software-compliance", "name"=>"Software Compliance", "type"=>"MarketTag"}] 

我已经试过我已经创造了创业板里面很多方法。

第一种方法是创建一个特殊的班级和每个数组元素映射到类:

Attempt 1: 
IDSearch.new(parsed_response) 

Attempt 2: 
parsed_response.map {|t| IDSearch.new(t)} 

Attempt 3: 
parsed_response.each do |hsh| 
SimpleAngel::IDSearch.new(hsh) 
end 

Attempt 4: 
10.times do |i| 
    instance_variable_set "@response_#{i}", parsed_response[i]   
end 

Attempt 5 (getting desperate) 
@response0 = parsed_response[0] 
@response1 = parsed_response[1] 
@response2 = parsed_response[2] 
@response3 = parsed_response[3] 
@response4 = parsed_response[4] 
@response5 = parsed_response[5] 
@response6 = parsed_response[6] 
@response7 = parsed_response[7] 
@response8 = parsed_response[8] 
@response9 = parsed_response[9] 

Attempt6: (this time inside of a rails controller) 

search_object = SimpleAngel::Search.new 
responses = search_object.id_search(params[:query], params[:type]) 
responses.each_with_index do |response, i| 
    u  = Idquery.new 
    u.name = response[i]['name'] 
    u.id = response[i]['id'] 
    u.url = response[i]['url'] 
    u.type = response[i]['type'] 
    u.pic = response[i]['pic'] 
    u.save 
end 

这些方法都具有:

class IDSearch 
    attr_accessor :id, :thumbnail, :url, :name, :type 
    def initialize(the_hash) 
    @id = the_hash['id'] 
    @url = the_hash['url'] 
    @pic = the_hash['pic'] 
    @name = the_hash['name'] 
    @type = the_hash['type'] 
    end 
end 

我会根据试图一一列举产生了一个可预测的,一致的,可行的回应。

不仅仅是一个实际的解决方案,我正在寻找关于我的思维如何存在缺陷的线索。

+3

尝试2似乎为我工作得很好。你有什么问题?顺便说一句:'attr_accessor'也可能被称为'pic',而不是'thumbnail'。 – 2012-07-14 08:30:10

+2

事实上,片段2的作品。我们可以看到这种情况下的错误吗? – tokland 2012-07-14 09:29:26

+0

测试期间错误太多朗姆酒。尝试2是正确的。如果你们没有告诉我,我可能从来没有想过出于挫折感。谢谢。 – cplusplusiterators 2012-07-15 01:08:56

回答

0

在试图1中,您期待在IDSearch.new中实现散列并实际传递数组。 如果你不是做:

parsed_response.each {|hash| p IDSearch.new(hash)} 

它工作得很好。

@id=3, @url="https://angel.co/mobile-4", @pic="/images/icons/market.png", @name="Mobile", @type="MarketTag" 
0
require 'ostruct' 
parsed_response.map {|resp| OpenStruct.new(resp)} 

删除特定类的需要。

+0

评论者是正确的,尝试2是正确的。但谢谢你教我新的东西。 – cplusplusiterators 2012-07-15 01:08:05

+0

返回的错误:“NoMethodError:undefined method'each'for# cplusplusiterators 2012-07-15 01:23:06