5

Czy możliwe jest warunkowe dołączenie skojarzenia has_one do aktywnego serializera modelu na podstawie rekordu?Aktywne stowarzyszenia warunkujące model szeregowy

W moim przypadku nie muszę zwracać powiązania o nazwie "grupa", jeśli grupa jest typu "niewidoczny". Oto fragment z mojego serializera.

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

Co chciałbym zrobić coś do skutku:

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

Does Grupa posiada pole o nazwie 'invisible'? I czy zdefiniowałeś metody takie jak 'niewidzialne?' I 'get_group' lub to tylko przykład. –

+0

Tak, get_group i niewidoczny? są istniejące metody. – Dan

Odpowiedz

12

Zakładając jesteś using version ~> 0.8.0, powinieneś być w stanie umieścić następujące informacje w swoim PostFeedSerializer.

def include_group? 
    !object.get_group.invisible? 
end 

To będzie warunkowo zawierać przedmiot group ilekroć include_group? Zwraca true.

Wygląda jak in future versions, AMS będzie się przenosił do metod filter zamiast include_x?.

+1

Dzięki Aron. To najfajniejsza rzecz od czasu krojonego chleba! – Dan

+1

Może być chłodniej niż krojonego chleba. Oba są jednak dobre. – Fuser97381

+1

gdzie jest dokumentacja dla tego? – Jwan622

1

Dla każdego, stosując bardziej aktualną wersję modelu aktywnego serializer, rozwiązaniem byłoby:

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

Można również zrobić:

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

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

Obawiam się nowego modelu Serializer Active Model. Za dużo zmian. – Dan

+1

Dodałem w inny sposób, że możesz osiągnąć ten sam rezultat. Nie bój się zmiany mojego małego konika polnego. – FutoRicky