我使用Foursquare2 Ruby包装器调用Foursquare API https://github.com/mattmueller/foursquare2
如果我使用以下命令在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数据库的:text列中,并让它保持其哈希结构。
我非常感谢这里的帮助。
答案 0 :(得分:4)
您可以使用ActiveRecord serialize
方法:
class Restaurant < ActiveRecord::Base
serialize :foursquare_location
end
然后,您可以将对象指定为foursquare_location
的值。
这应该适用于Hashie::Mash
(我自己从未尝试过,但它适用于常规哈希)。如果您一次访问大量记录,可能会受到轻微的性能影响,查询此字段会有点困难,但它应该适用于您所描述的内容。
答案 1 :(得分: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"
希望这适用于您的场景。