2014-04-01 4 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 и превращает их всех в Рубине объекты:

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