2014-04-01 77 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