2014-04-01 2 views
3

내 애플리케이션에서 ActiveResource를 사용하여 원격 API에서 수신 한 데이터를 관리하고 있습니다. 예를 들어, 내 모델 중 하나는 Account이며, settings이라는 필드가 있습니다.이 필드는 API에 "자유 형식 해시"로 기록되어 있습니다. 즉, 무엇이든 저장할 수 있습니다.ActiveResource 모델에서 중첩 된 객체에 대한 해시 생성

나는 API에서받을

샘플 단순화 된 JSON :

{ 
    "account": { 
     "title": "My Account", 
     "settings": { 
      "a_random_setting": true, 
      "another_random_setting": 42, 
      "a_subconfig_of_sorts": { 
       "is_deep": true 
      } 
     } 
    } 
} 

ActiveResource 매우 친절하게 모든 방법이 JSON에서 가장 깊은 중첩 된 개체를 아래로 가서 루비로 모두 전환은 객체 :

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