2012-10-31 41 views
3

我打電話使用Foursquare2紅寶石Foursquare的API的包裝https://github.com/mattmueller/foursquare2Foursquare的位置哈希存儲爲Rails的模型屬性/列

如果我和初始化客戶端在Rails的控制檯:

client = Foursquare2::Client.new(:client_id =>'CLIENT_ID', :client_secret => 'CLIENT_SECRET') 

然後我通過location_id調用Foursquare API(例如使用5104)。

restaurant = client.venue(5104) 

這會返回一個巨大的Ruby Hashie :: Mash。所以,如果我只想要的位置哈希然後我做

restaurant.location 

這給了我這個「位置哈希」

#<Hashie::Mash address="4 Clinton St." cc="US" city="New York" country="United States" crossStreet="at E Houston St." lat=40.721294 lng=-73.983994 postalCode="10002" state="NY"> 

現在,如果我做restaurant.location.address 這將返回=> "4 Clinton St."

所以,現在退出Rails控制檯並輸入一個Rails應用程序。我的問題 - 作爲我的Rails「餐廳」模型中的after_save方法調用,我將這個「位置散列」保存在我的模型中的「foursquare_location」列中作爲:文本字段。

在我的「餐廳」視圖模板中顯示餐廳地址的詳細信息,我該如何編寫我的模板,以便我可以調用@ restaurant.foursquare_location.address,以便它訪問地址鍵以返回地址值?

我不確定是否可以直接將Foursquare API響應直接保存到我的SQLite3數據庫中的文本列中並讓其保持其散列結構。

我真的很感謝這裏的幫助。

回答

4

可以使用的ActiveRecord serialize方法:

class Restaurant < ActiveRecord::Base 
    serialize :foursquare_location 
end 

然後可以分配一個目的是是foursquare_location值。

這應該與Hashie::Mash(我從來沒有嘗試過自己,但它與正常哈希工作正常)。如果您一次訪問大量記錄,您可能會遇到輕微的性能下降,並且查詢此字段有點困難,但它應該適用於您所描述的內容。

+0

我可以看到,這是工作序列化HASHIE ::搗碎成一個很好的格式化的散列當我告訴使用<%= Model.foursquare_location%>的記錄,但我怎麼在我看來只是一個價值基礎上的顯示關鍵如:地址? –

+0

嗨@ZachKemp該解決方案幫助我序列化哈希,但仍不能確定如何訪問每個鍵:從我的瀏覽哈希值。你能幫忙嗎?謝謝。 –

+0

你應該能夠用'@ restaurant.foursquare_location.address'訪問它。當從數據庫中檢索餐館時,序列化的對象將自動加載。 –

1

雖然我沒有完全測試過這個Hashie的確切方法,但你可以使用ActiveRecord :: Store來做到這一點。這提供了一個將散列存儲在數據庫的一列中的包裝器。

http://api.rubyonrails.org/classes/ActiveRecord/Store.html

這是我工作的一個Rails應用程序砍倒例子。該模型有一個名爲days_hours的列,然後我可以參考它們,如果它們是實際屬性。

class ProposedEvent < ActiveRecord::Base 
    store :days_hours, accessors: [:mon, :tue, :wed, :thu, :fri, :sat, :sun] 
end 

在IRB:

my_event = ProposedEvent.new 
my_event.days_hours = {:mon => '7, 8', :tue => '14, 15'} 

這就被存儲下來在數據庫中,你,你可以只用方便的方法來訪問這個,就好像你有這些存儲爲單獨的列。

puts my_event.mon 
=> "7, 8" 

希望適合您的情況。

+0

只需要注意一點,如果您使用的是我相信的Rails 3.2,這個方法將僅供您使用。它可能比這更早一點,但我知道這是一個相當新的增加。 – Planty

+0

感謝您的回答 - 我沒有給這是一個嘗試,因爲在ActiveRecord的序列化方法似乎是一個更直接的問題的答案。 –