Foursquare位置哈希存储作为Rails模型属性/列

时间:2012-10-31 01:25:43

标签: ruby-on-rails activerecord serialization hash foursquare

我使用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列中,并让它保持其哈希结构。

我非常感谢这里的帮助。

2 个答案:

答案 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"

希望这适用于您的场景。