3

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

我非常感谢这里的帮助。

4

2 回答 2

4

您可以使用 ActiveRecordserialize方法:

class Restaurant < ActiveRecord::Base
  serialize :foursquare_location
end

然后,您可以将对象分配为 的值foursquare_location

这应该适用Hashie::Mash(我自己从未尝试过,但它适用于常规哈希)。如果您一次访问大量记录,您可能会受到轻微的性能影响,并且查询此字段有点困难,但它应该适用于您所描述的内容。

于 2012-10-31T02:37:19.900 回答
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"

希望这适用于您的场景。

于 2012-10-31T02:42:08.507 回答