2014-12-30 38 views
7

我在使用rails-apiactive-model-serializer來構建Rest API以輕鬆過濾JSON中的必需字段。我也在這些序列化程序中使用has_one關聯。我只想知道如何爲has_one屬性指定不同的鍵名稱。在rails api活動模型串行器中爲關聯屬性使用不同的鍵名稱

也就是說,我有兩個模型說:EmployeeAddress,並有一個has_one :address在說EmployeeSerializer。我得到的迴應是:

{ 
    id: 1, 
    address: { 
    street: "some_street", 
    city: "some_city" 
    } 
} 

但我想獲得以下響應:

{ 
    id: 1, 
    stays: { 
    street: "some_street", 
    city: "some_city" 
    } 
} 

我試着用has_one :address, :key => :stays,但似乎並沒有工作。

+0

你使用哪個版本的AMS的?我並不熟悉代碼庫,但從簡單的角度來看,他們的「關鍵」論點似乎並未包含在所有最新的代碼中。作爲一種解決方法,嘗試將'has_one:stays'和'def stay'一起定義; object.address; end'。 – janfoeh

+0

@janfoeh我正在使用0.9.0版本。此外,我正在使用不同的序列化程序進行關聯。即'has_one:address,key:'status',序列化程序:MyAddressSerializer'。它從MyAddressSerializer獲取屬性,但屬性鍵仍然是地址 – swaroopsm

+0

啊。如果我正確讀取[0.9.0和0.9.1之間的變化](https://github.com/rails-api/active_model_serializers/compare/v0.9.0...v0.9.1),則該參數被稱爲'embed_key '在0.9.0中,而不是'鑰匙'。 – janfoeh

回答

7

您可以定義stays,只要你想在你的JSON的屬性之一。

當然,序列化程序將轉到模型實例,並且沒有在該模型中找到具有該名稱的屬性。所以,它會坐在那裏撓撓頭,看看:stays的價值應該是什麼。

沒關係,因爲你可以在你的序列化器中定義一個實例方法,告訴它到底應該是什麼值。在這種情況下,您會得到object變量,它是串行器當前正在處理的對象。 object.address因此將是您的Address實例。

一旦你有你的地址實例,你可以實例化一個序列化器,它將使用該實例來顯示其內部概述的字段。我相信,root: false是必要的,否則,:stays屬性(或任何序列化程序在這種情況下返回給您)將顯示在另一個:stays屬性內。

您的Employee最後串應如下:

class EmployeeSerializer < ActiveModel::Serializer 
    attributes :id, :name, :stays 

    def stays 
    MyAddressSerializer.new(object.address, root: false) 
    end 

end 
+0

添加一些描述來說明它爲什麼能完成這項工作。它的質量非常低,不適合SO Q&A的風格,並被標記爲低質量郵政。 – Cheesebaron

+0

@Cheesebaron這是怎麼回事?:) – Kalman

+0

好多了:) – Cheesebaron

3

@janfoeh是對的。我只是在0.8版本測試,這和它工作得很好

  1. gem "active_model_serializers", "~> 0.8.0"在你的Gemfile
  2. 殺死服務器
  3. $bundle install
  4. has_one :address, key: "stays"
  5. 啓動服務器備份

很棒!

至於創業板的文件說,(here),「你可能想用0.8版」

+0

如果我使用'0.8.0'版本,'MyAddressSerializer'不起作用:'has_one:address,key:'status',序列化程序:MyAddressSerializer' – swaroopsm

+0

@swaroopsm is 'Address'總是用'MyAddressSerializer'串行化?如果是的話,你可以在'Address'上用'def active_model_serializer; MyAddressSerializer; end'來定義它。 – janfoeh

相關問題