JavaScriptを有効にしてください

【Elixir】データ取得時に複数のChangesetを返すようにする

 ·  ☕ 1 分で読めます

【Elixir】データ取得時に複数のChangesetを返すようにする

Elixir でRepoを使用したデータ取得時に複数のChangesetを返すようにする方法。

環境

  • Elixir 1.14.2

通常通りにJOINしてデータを取得する

JOINして複数のテーブルからデータを取得します。

1
2
3
4
5
6
7
8
query =
  from(
    user in Demo.Models.User,
    join: post in Demo.Models.Post,
    on: user.id == post.user_id
  )

IO.inspect(Repo.all(query))

実行すると users テーブルのデータしか取得していません。
これでは困ります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[
  %Demo.Models.Users{
    __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
    id: 1,
    name: "demo1"
  },
  %Demo.Models.Users{
    __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
    id: 2,
    name: "demo2"
  },
]

複数のchangesetを返却させる

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
query =
  from(
    user in Demo.Models.User,
    join: post in Demo.Models.Post,
    on: user.id == post.user_id,
    select: %{
      user: user,
      post: post
    }
  )

IO.inspect(Repo.all(query))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[
  %{
    user: %Demo.Models.Users{
      __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
      id: 1,
      name: "demo1"
    },
    post: %Demo.Models.Post{
      __meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
      id: 1,
      title: "タイトル1",
      body: "本文1",
    }
  },
  %{
    user: %Demo.Models.Users{
      __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
      id: 1,
      name: "demo1"
    },
    post: %Demo.Models.Post{
      __meta__: #Ecto.Schema.Metadata<:loaded, "posts">,
      id: 1,
      title: "タイトル2",
      body: "本文2",
    }
  },
]

これで扱いやすい形にして受け取ることができます。

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer