5

È possibile includere condizionalmente un'associazione has_one in un serializzatore di modello attivo su base record per record?Associazioni condizionali serial serial modello attivo

Nel mio caso non è necessario restituire un'associazione denominata "gruppo" se il gruppo è del tipo "invisibile". Ecco uno snippet dal mio serializzatore.

class PostFeedSerializer < ActiveModel::Serializer 
    attributes :id, :title, :thumbnail_photo, :view_count, :ago, :created_by 
    has_one :group, serializer: GroupSerializer 

Quello che mi piacerebbe fare è qualcosa per l'effetto di:

has_one :group, serializer: GroupTinySerializer unless object.get_group.invisible? 
+0

fa Gruppo ha un campo chiamato 'invisible'? E hai definito metodi come "invisibile?" E "get_group" o questo è solo un esempio. –

+0

Sì, get_group e invisibile? sono metodi esistenti. – Dan

risposta

12

supponendo che si sta using version ~> 0.8.0, si dovrebbe essere in grado di mettere quanto segue nel PostFeedSerializer.

def include_group? 
    !object.get_group.invisible? 
end 

Che condizionalmente includere l'oggetto group ogni volta include_group? restituisce true.

Sembra in future versions, AMS passerà a filter anziché a include_x? metodi.

+1

Grazie Aron. Questa è la cosa più bella dopo il pane a fette! – Dan

+1

Potrebbe essere più bello del pane a fette. Entrambi sono comunque buoni. – Fuser97381

+1

dov'è la documentazione per questo? – Jwan622

1

per chiunque utilizzi una versione più recente di attivo Modello Serializer, la soluzione potrebbe essere:

def filter(keys) 
    keys.delete :group unless !object.get_group.invisible? 
    keys 
    end 

si può anche fare:

has_one :group, serializer: GroupTinySerializer, unless: -> { invisible? } 

def invisible? 
    object.get_group.invisible? 
end 
+0

Ho paura del nuovo Serializer Active Model. Troppo cambiamento. – Dan

+1

Ho aggiunto un altro modo per ottenere lo stesso risultato. Non aver paura di cambiare la mia piccola cavalletta. – FutoRicky