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

时间:2014-04-01 02:42:22

标签: ruby-on-rails ruby json hash activeresource

在我的应用程序中,我使用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

这使得在settings的内容中查找动态密钥有点困难。基本上,我宁愿将settings作为常规哈希,而不是为我动态生成的自定义嵌套对象。

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

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

1 个答案:

答案 0 :(得分:3)

制作适用于该问题的解决方案。希望有所帮助。

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