2014-12-30 25 views
7

'daki ilişkilendirme özniteliği için farklı bir anahtar adı kullanmak JSON'daki gerekli alanları kolayca filtrelemek için rails-api ve active-model-serializer kullanarak Rest API yapıyorum. Bu serileştiricilerde de has_one ilişkisini kullanıyorum. Tüm bilmek istediğim, has_one özniteliği için farklı bir anahtar adı nasıl belirtebilirim. Employee ve Address ve bir has_one :address diyelim EmployeeSerializer vardır: isRaylar api active model serializer

, ben iki model söz sahibi.

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

Ama şu yanıtı almak istiyorum: Ben almak yanıttır

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

Ben has_one :address, :key => :stays kullanarak çalıştı, ancak bu işe görünmüyor.

+0

AMS hangi sürümünü kullanıyorsunuz şu şekildedir:

Employee için Nihai serileştirici görünmelidir? Ben kod tabanı ile yakından tanıdık değilim, ama hızlı bir bakış açısıyla 'anahtar' argümanı tüm yeni olanlara dahil edilmemiş gibi görünüyor. Bir geçici çözüm olarak, 'has_one: konaklamaları '' def 'ile birlikte tanımlamayı deneyin; object.address; Sonu '. – janfoeh

+0

@janfoeh 0.9.0 sürümünü kullanıyorum.Ayrıca dernek için farklı bir serializer kullanıyorum. yani, has_one: adres, anahtar: 'status', serializer: MyAddressSerializer'. Bu MyAddressSerializer' 'dan özelliklerini alıyor ama özellikte temel hala' address' – swaroopsm

+0

Ah olduğunu. I [0.9.0 ve 0.9.1 arasında değişir] okumak (https://github.com/rails-api/active_model_serializers/compare/v0.9.0...v0.9.1) doğru, bağımsız değişken olarak adlandırılan 'embed_key '0.9.0 değil,' anahtar '. – janfoeh

cevap

7

Size json olmasını istediğiniz özelliklerin biri olarak stays tanımlayabiliriz "muhtemelen sürüm 0.8 kullanmak istiyorum", (here) diyor. Doğal olarak, seri hale getirici model örneğine gidecektir ve modelde bu ada sahip bir öznitelik bulamayacaktır. Yani, orada otururken orada dünyanın ne kadar :stays değerinin olması gerektiği konusunda kafa çizecek.

Bu sorun değil, çünkü seri hale getiricinizde, o değerin tam olarak ne olması gerektiğini belirten bir örnek yöntemi tanımlayabilirsiniz. Bu örnek yönteminde, serializer'ın şu anda işlediği nesne olan object değişken verilir. object.address, bu nedenle Address örneğiniz olacak.

Adres örneğinizi aldıktan sonra, bu örneği kullanacak diziyi, içinde anahatları çizilen alanları görüntülemek üzere başlatabilirsiniz. root: false'un diğer :stays özniteliğine (veya bu durumda seri hale getirici ne verirse döndürür) başka bir :stays özniteliğinin içinde görüntüleneceğine inanıyorum.

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

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

end 
+0

iş yapacak niçin bazı açıklama ekleyin şu anda cevap standları olarak. Çok düşük kalitededir ve SO Q & A stiline çok uygun değildir ve bir Düşük Kalite Post olarak işaretlenmiştir. – Cheesebaron

+0

@Cheesebaron bu nasıl? :) – Kalman

+0

Çok daha iyi :) – Cheesebaron

3

@janfoeh sağda. Sadece 0.8 versiyonu bu test edilmiş ve bunun

geri sunucuyu

  • $bundle install
  • has_one :address, key: "stays"
  • Başlangıç ​​sunucusunu öldür sizin Gemfile
  • yılında

    1. gem "active_model_serializers", "~> 0.8.0" gayet güzel çalışıyor Harika çalışıyor! taş belgelerine olarak

  • +0

    ben '0.8.0' sürümünü kullanıyorsanız,' MyAddressSerializer' çalışmaz: 'has_one: adres, anahtar: 'status', seri hale: MyAddressSerializer' – swaroopsm

    +0

    @swaroopsm olduğunu ? MyAddressSerializer;; 'Address' hep MyAddressSerializer' evet ise, def active_model_serializer' ile Address' kendisi 'o tanımlayabilirsiniz' ile tefrika. Sonu ' – janfoeh

    İlgili konular