2013-05-01 43 views
12

Etkin bir model kaynağında serileştirilmiş ilişkilendirmelerin düzeyini sınırlamakla ilgili bir sorun yaşıyorum. ÖrneğinSınırlı Dernekler Active Model Seri hale getiricide Cascade

:

bir oyun, ben Ekibi için JSON aldığınızda birçok Oyuncular

class GameSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :teams 
end 

class TeamSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :players 
end 

class PlayerSerializer < ActiveModel::Serializer 
    attributes :id, :name 
end 

olan birçok Takımlar vardır istediğiniz gibi bir alt dizide tüm oyuncuları kapsar.

Oyun için JSON'u aldığımda, bir alt dizideki tüm Takımları, mükemmel, ancak her Takım için tüm oyuncuları içerir. Beklenen davranış bu, ancak derneklerin seviyesini sınırlamak mümkün mü? Oyun sadece Oyuncular olmadan serileştirilmiş Takımları iade etsin mi? Sonra

class ShortTeamSerializer < ActiveModel::Serializer 
    attributes :id 
end 

:

class GameSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :teams, serializer: ShortTeamSerializer 
end 

Ya Tanımlayabileceğiniz include_teams?GameSerializer bir:

class GameSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :teams 

    def include_teams? 
    @options[:include_teams] 
    end 
end 

cevap

12

Diğer bir seçenek Raylar istekli kötüye etmektir Başka Serializer oluşturabilir

+0

'object.association (: comments) .loaded?' Bu tam olarak aradığım şey, teşekkürler! Bu yöntemin kabul edilen cevaptan daha temiz olduğunu düşünüyorum. Active_model_serializer dokümanlarından, n + 1 sorgularını önlemek için bir birleştirici veya denetleyicide bulunan ilişkilendirmeleri eklemesi önerilir. Nişanlandığım yerde, bir ilişkilendiricinin yüklenip yüklenmediğini ya da atlamak için diziselleştiricideki yerini aldım. Belgelerden: "En iyi şekilde veri yüklendiğinden emin olarak n + 1 sorgularını engellemeye çalışın; örn. ActiveRecord kullanıyorsanız, sorgu içeriklerini veya gerekiyorsa katılmayı isteyebilirsiniz" – Mark

+2

Nerede aramak zorundayım include_comments? yöntem? – Kaspar

8

hangi ilişkilendirmelerin ren olduğunu belirlemek için yükleme der: En raylar denetleyicisi olarak

:

AMS topraklarda ardından
def show 
    @post = Post.includes(:comments).find(params[:id]) 
    render json: @post 
end 

:

Muhtemelen
class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title 
    has_many :comments, embed: :id, serializer: CommentSerializer, include: true 

    def include_comments? 
    # would include because the association is hydrated 
    object.association(:comments).loaded? 
    end 
end 

değil en temiz çözüm, ancak benim için güzel çalışıyor!

+0

Teşekkürler Pablo, yaptığım işte bu ... Yaptığım şey biraz raylar, modelleme: indeks ve: çoğullamayı gösterme ama bir TeamsSerializer ve TeamSerializer'a sahip olmaktı. Özel durumlar farklı bir serileştirici alır. –

+4

@options nereden geldi? – Samnang

İlgili konular