Ruby on rails 使ActiveResource模型为嵌套对象生成哈希

Ruby on rails 使ActiveResource模型为嵌套对象生成哈希,ruby-on-rails,ruby,json,hash,activeresource,Ruby On Rails,Ruby,Json,Hash,Activeresource,在我的应用程序中,我使用ActiveResource管理从远程API接收的数据。比如说,我的一个模型名为Account,它有一个名为settings的字段,该字段在API中被记录为“自由格式散列”,这意味着它可以存储任何内容 我将从API收到一个简化的JSON示例: { "account": { "title": "My Account", "settings": { "a_random_setting": true,

在我的应用程序中,我使用ActiveResource管理从远程API接收的数据。比如说,我的一个模型名为
Account
,它有一个名为
settings
的字段,该字段在API中被记录为“自由格式散列”,这意味着它可以存储任何内容

我将从API收到一个简化的JSON示例:

{
    "account": {
        "title": "My Account",
        "settings": {
            "a_random_setting": true,
            "another_random_setting": 42,
            "a_subconfig_of_sorts": {
                "is_deep": true
            }
        }
    }
}
ActiveResource非常友好地深入JSON中最深的嵌套对象,并将它们全部转换为Ruby对象:

my_account.settings # => Account::Settings
my_account.settings.a_subconfig_of_sorts # => Account::Settings::ASubconfigOfSorts
这使得在
设置的内容中查找动态键有点困难。本质上,我更希望将
设置作为常规散列,而不是动态生成自定义嵌套对象

my_account.settings.class # => Hash
my_account.settings[:a_subconfig_of_sorts] # => {:is_deep => true}

如何让ActiveResource做到这一点?我的第一个猜测是使用
模式
声明,但这似乎只提供标量类型。

提出了解决该问题的解决方案。希望有帮助

class Account < ActiveResource::Base
  create_reflection :settings_macro, :settings, class_name: 'Account::Hash'  
  class Hash < ::Hash
    def initialize(hash, persisted)
      merge!(hash)
    end
  end
end
类帐户