在我的应用程序中,我使用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
声明,但似乎只提供了标量类型。
答案 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