2015-01-02 17 views
0

我想創建一個壟斷管理器的樂趣,我有一個JSON文件中的所有瓷磚的數據, d喜歡用於迭代和使用數據。我目前有這樣的代碼:我有一個類,有一些參數,我想使用JSON文件中的數據來填充

require 'json' 

file = File.read('monopoly-data.json') 
data_hash = JSON.parse(file) 
data = data_hash['properties'].sort_by{ |e| e['id'].to_i } 

class Property 
    attr_accessor :id, :group, :colour, :name, :price, :rent, :house_price, :mortage 

    def initialize(params = {}) 
    @id = params[:id] 
    @group = params[:group] 
    @colour = params[:colour] 
    @name = params[:name] 
    @price = params[:price] 
    @rent = params[:rent] 
    @house_price = params[:house_price] 
    @mortage = params[:mortage] 
    end 
end 

而JSON文件是in this gist

我一直無法弄清楚如何使用JSON數據,使更多的特性,我已經對數據for循環玩耍了,data.each試圖讓這樣的事情自動:

parkveien = Property.new(
    id: 1, 
    group: 'property', 
    colour: 'brown', 
    name: 'Parkveien', 
    price: 1200, 
    rent: [40, 200, 600, 1800, 3200, 5000], 
    house_price: 1000, 
    mortage: 600 
) 

但是,我無法圍繞如何做到這一點,任何幫助將不勝感激!

回答

2

您可以使用each來生成Property對象並將它們收集到數組中。

properties = [] 
data.each { |property| properties << Property.new(property) } 

然後,您可以根據需要使用select從數組中訪問各個屬性。

properties.select { |property| property.name == "Parkveien" }  

此外,由於在數據的哈希鍵是字符串,你需要改變你的初始化,而不是使用符號的字符串:

def initialize(params = {}) 
    @id = params["id"] 
    @group = params["group"] 
    @colour = params["colour"] 
    @name = params["name"] 
    @price = params["price"] 
    @rent = params["rent"] 
    @house_price = params["house_price"] 
    @mortage = params["mortage"] 
end 
+0

謝謝,我會在明天當它看看我醒了,但我很感激你花時間! –

+0

沒關係,想睡覺之前試試它,反正它工作!謝謝你,你救了我幾個小時的頭痛。 –

+2

'detect'方法實際上比'select'好得多,因爲'detect'在第一個返回true的塊處停止。無論如何,選擇都會一直持續到收集結束。 @SondreNilsen –

相關問題