【Elixir】データ取得時に複数のChangesetを返すようにする
【Elixir】データ取得時に複数のChangesetを返すようにする
Elixir でRepoを使用したデータ取得時に複数のChangesetを返すようにする方法。
環境
- Elixir 1.14.2
通常通りに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",
}
},
]
これで扱いやすい形にして受け取ることができます。