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

最佳答案

解决了这个问题。希望能有所帮助。

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

关于ruby-on-rails - 使ActiveResource模型为嵌套对象生成哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22775843/

10-11 04:13