2015-07-06 8 views
5

Próbuję zwrócić niektóre dane JSON w jednym z moich wywołań API w Phoenix. Pobieram wszystkie rekordy Subject i wysyłam je, ale zwracam kilka dodatkowych pól, których nie chcę.Otrzymuj tylko określone pola podczas pobierania danych za pomocą Ecto w Phoenix

Co mogę zrobić, aby:

  • dostać tylko specyficzne atrybuty (np tylko id i name)
  • not Get zbędnych pól w mojej odpowiedzi (jak __meta__ i __owner__)

To jest mój Controller:

# Controller 
def index(conn, _) do 
    subjects = Subject |> Repo.all 
    conn |> render subjects: subjects 
end 

To jest mój View:

# View 
def render("index.json", %{subjects: subjects}) do 
    subjects 
end 

To jest moja odpowiedź:

[ 
    { 
     "teachers": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "teachers", 
      "__cardinality__": "many" 
     }, 
     "updated_at": "2015-06-20T15:32:20Z", 
     "topics": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "topics", 
      "__cardinality__": "many" 
     }, 
     "name": "Physics", 
     "inserted_at": "2015-06-20T15:32:20Z", 
     "id": 1, 
     "__meta__": { 
      "state": "loaded", 
      "source": "subjects" 
     } 
    }, 
    { 
     "teachers": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "teachers", 
      "__cardinality__": "many" 
     }, 
     "updated_at": "2015-06-20T15:37:59Z", 
     "topics": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "topics", 
      "__cardinality__": "many" 
     }, 
     "name": "Chemistry", 
     "inserted_at": "2015-06-20T15:37:59Z", 
     "id": 2, 
     "__meta__": { 
      "state": "loaded", 
      "source": "subjects" 
     } 
    }, 
    { 
     "teachers": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "teachers", 
      "__cardinality__": "many" 
     }, 
     "updated_at": "2015-06-20T15:38:41Z", 
     "topics": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "topics", 
      "__cardinality__": "many" 
     }, 
     "name": "Mathematics", 
     "inserted_at": "2015-06-20T15:38:41Z", 
     "id": 3, 
     "__meta__": { 
      "state": "loaded", 
      "source": "subjects" 
     } 
    }, 
    { 
     "teachers": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "teachers", 
      "__cardinality__": "many" 
     }, 
     "updated_at": "2015-06-22T15:40:17Z", 
     "topics": { 
      "__owner__": "Elixir.MyApp.Subject", 
      "__field__": "topics", 
      "__cardinality__": "many" 
     }, 
     "name": "Biology", 
     "inserted_at": "2015-06-22T15:40:17Z", 
     "id": 4, 
     "__meta__": { 
      "state": "loaded", 
      "source": "subjects" 
     } 
    } 
] 

Odpowiedz

11

Zmień widok na:

def render("index.json", %{subjects: subjects}) do 
    Enum.map(subjects, &Map.take(&1, [:id, :name])) 
end 

Dodatkowo można również zapytać ekto powrót podzbiór pól poprzez zmianę kontrolera na:

def index(conn, _) do 
    subjects = from(s in Subject, select: %{id: s.id, name: s.name}) |> Repo.all 
    conn |> render subjects: subjects 
end 
+0

Dzięki za odpowiedź. Rozumiem, jak wybierać określone pola, ale co jeśli chcę odrzucić określone pole i uzyskać wszystko inne. Na przykład, jeśli nie chcę "nauczycieli" i "tematów" w powyższym przykładzie. – Sheharyar

+2

Zmień 'Map.take/2' na' Map.drop/2'. Wszystkie funkcje map można znaleźć na stronie http://elixir-lang.org/docs/stable/elixir/. –

Powiązane problemy