2015-08-20 83 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