【问题标题】:Foursquare Location Hash Store as a Rails Model Attribute / ColumnFoursquare 位置哈希存储作为 Rails 模型属性/列
【发布时间】:2012-10-20 10:37:08
【问题描述】:

我正在使用 Foursquare2 Ruby 包装器 https://github.com/mattmueller/foursquare2 调用 Foursquare API

如果我在 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 这将返回=&gt; "4 Clinton St."

现在,退出 Rails 控制台并进入 Rails 应用程序。我的问题 - 作为我的 Rails“餐厅”模型中的 after_save 方法调用,我将这个“位置哈希”在我的模型中的“foursquare_location”列中保存为:文本字段。

在显示餐厅地址详细信息的“餐厅”视图模板中,如何编写模板以便调用@restaurant.foursquare_location.address 以访问地址键以返回地址值?

我不确定是否可以直接将 Foursquare API 响应直接保存到我的 SQLite3 数据库中的 :text 列中并让它保持其哈希结构。

非常感谢这里的帮助。

【问题讨论】:

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


    【解决方案1】:

    您可以使用 ActiveRecord serialize 方法:

    class Restaurant < ActiveRecord::Base
      serialize :foursquare_location
    end
    

    然后您可以将一个对象指定为foursquare_location 的值。

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

    【讨论】:

    • 当我使用 显示记录时,我可以看到这正在将 Hashie::Mash 序列化为格式良好的哈希,但是我如何在我的视图中显示一个基于键的值,例如 :address?
    • 嗨@ZachKemp 这个解决方案帮助我序列化哈希,但仍然不确定如何从我的视图访问哈希中的每个键:值。你能帮忙吗?谢谢。
    • 您应该可以使用@restaurant.foursquare_location.address 访问它。从数据库中检索餐厅时,将自动加载序列化对象。
    • 当我从我的 rails 应用程序中执行 时,它给了我这个错误“#<0x000000056d1988>
    【解决方案2】:

    虽然我还没有用 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"
    

    希望这适用于您的场景。

    【讨论】:

    • 请注意,此方法只有在您使用我相信 Rails 3.2 时才可用。它可能比那更早一些,但我知道这是一个相当新的添加。
    • 感谢您的回答 - 我没有尝试,因为 ActiveRecord 中的序列化方法似乎更直接地回答了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2017-06-14
    • 2015-02-10
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2017-12-14
    • 2019-06-30
    相关资源
    最近更新 更多