2014-04-01 40 views
3

在我的应用程序中,我使用ActiveResource来管理从远程API接收的数据。比方说,我的模型之一叫Account,它有一个名为settings的字段,在API中记录为“自由形式的散列”,这意味着它可以存储任何内容。使ActiveResource模型为嵌套对象生成散列

样本简化JSON我会收到来自API:

{ 
    "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声明,但它似乎只提供了标量类型。

回答

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