Copy & Paste Engineer

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

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

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

環境

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

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

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 テーブルのデータしか取得していません。 これでは困ります。

[
  %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を返却させる

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))
[
  %{
    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",
    }
  },
]

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