2015-08-20 58 views
2

我试图让postgres_ext-串行宝石的工作,和我建立了一个测试项目非常相似,https://github.com/dockyard/postgres_ext-serializers/blob/master/test/test_helper.rb如何使用postgres_ext-serializers获取嵌套的JSON /哈希元素?

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :name, :mobile 
    embed :ids, include: true 
    has_one :address, serializer: AddressSerializer 

    def include_mobile? 
    false 
    end 
    alias_method :include_address?, :include_mobile? 
end 

class AddressSerializer < ActiveModel::Serializer 
    attributes :id, :district_name 
    embed :ids, include: true 
end 

当我尝试运行串行输出似乎不具有嵌套元素。例如我的串行器to_json输出是:

“{\”users \“:[{\”id \“:1,\”name \“:\”Aaron \“,\”mobile \“:null} ,\“{\”id \“:\”name \“:\”Bob \“,\”mobile \“:null}],\”add​​resses \“:[{\”id \“: \“district_name \”:\“Rob's Address \”}}}“

请注意,用户和地址是散列的两个单独元素,即嵌套intead。如果我删除了postgres_ext-serializers gem,那么输出如预期:

“[{\”id \“:1,\”name \“:\”Rob \“,\”mobile \“:null ,\“地址\”:{\“id \”:1,\“district_name \”:\“Rob's Address \”}},{\“id \”:2,\“name \”:\“Bob \ “,\”mobile \“:null,\”add​​ress \“:null}]”

地址嵌入在用户哈希中,正是我期待的。

我错过了什么,当使用postgres_ext-serializers时,是否需要更改任何内容以使元素嵌套?

谢谢!

回答

1

看起来,您在序列化后收到的JSON是postgres_ext-serializers预期的。看看this testexpected_json在第一个测试用例中是:

{ 
    "users": [ 
    { 
     "id": <UserID>, 
     "name": "John", 
     "mobile": "51111111", 
     "offer_ids": [], 
     "reviewed_offer_ids": [] 
    } 
    ], 
    "offers": [], 
    "addresses": [ 
    { 
     "id": <AddressID>, 
     "district_name": "mumbai" 
    } 
    ] 
} 

它看起来与您收到的JSON非常相似。但是,说实话,由于include_address?方法在你的例子中返回false,我希望你一定没有将"addresses"字段包含到结果JSON中。

+0

是的,这很有趣......你认为输出的格式一样,由于Postgres的JSON功能限制,或者这是一个优选的JSON输出我想这在技术上可以节省重复?我见过的所有apis通常都有完整的嵌套对象,而不仅仅是引用顶级对象的ID? – Hawk

+0

我有'postgres_ext-serializers'的代码审查过,似乎没有'has_one'关系的特殊情况,不像'has_many'和'belongs_to'。它看起来与'active_model_serializers' gem不一致,请在GitHub上打开一个问题,看看创建者对它的看法。目前,我建议你在'AddressSerializer'的属性列表中添加'user_id'字段。至少,您将能够从生成的JSON中恢复'User'和'Address'模型之间的关系。 – Featalion