2013-04-18 69 views
2

以下代碼將使用ST_AsGeoJSON postgis函數查詢我的數據庫,並在rails控制檯中將json對象打印到屏幕上。如何將變量分配給活動記錄對象?

Zcta. 
    select("ST_AsGeoJSON(ST_simplify(geom,500)) as my_geo"). 
    where(geoid10: '90210').each do |result| 
    puts result.my_geo 
    end 

如果我想將該內容放入一個變量(或數組或哈希值),該怎麼辦?如果我將puts result.my_geo更改爲variable = result.my_geo,然後嘗試稍後使用該變量,則會出現錯誤,指出該變量不存在。

有什麼想法?

回答

2

您正在尋找map而不是each

each將每個項目迭代中你可枚舉並執行塊吧,返回nil。在您的示例中,puts將對象打印到控制檯,但不會將其存儲在任何位置。

map,而另一方面將執行塊爲枚舉的每個元素,並返回到你運行的每一個元素在給定塊的枚舉包含結果。

x = [1,2,3].map { |elem| elem + 1 } 
puts x 
[2,3,4] 

在你的情況,你可以做到以下幾點:

result = Zcta.select("ST_AsGeoJSON(ST_simplify(geom,500)) as my_geo") 
    .where(geoid10: '90210') 
    .map(&:my_geo) 

您的查詢的結果將現在被存儲爲可枚舉的變量result

+0

這樣做了!謝謝!儘管問題很快。 '.map(&:my_geo)'符號和冒號發生了什麼' –

+0

'&'是ruby中的「proc operator」。在這種情況下,它只是「在每個項目上調用此方法」的簡寫。這相當於說'.map {| x | x.my_geo}' – acoffman

+0

太棒了。是.map {| x | x.my_geo}'一個lambda的例子?感謝所有的幫助。非常感謝。 –

3

你是否在塊中定義了你的變量?然後它不會在外面訪問。 首先在塊外定義變量。

2

或者使用map代替:

variable = Zcta. 
    select("ST_AsGeoJSON(ST_simplify(geom,500)) as my_geo"). 
    where(geoid10: '90210').map do |result| 
    result.my_geo 
    end 
+0

你和thecoffman作出了同樣的答案和它的工作。非常感謝你! –