Elixir 从EXTO查询映射到关键字列表
我一直在RubyonRails世界中学习长生不老药 我有下表:Elixir 从EXTO查询映射到关键字列表,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我一直在RubyonRails世界中学习长生不老药 我有下表: release_track_id | release_id | track_id | release_side_id | track_number ------------------+------------+----------+-----------------+-------------- 347 | 70 | 211 | 3 |
release_track_id | release_id | track_id | release_side_id | track_number
------------------+------------+----------+-----------------+--------------
347 | 70 | 211 | 3 | 1
329 | 70 | 193 | 1 | 1
356 | 70 | 220 | 4 | 1
338 | 70 | 202 | 2 | 1
357 | 70 | 221 | 4 | 2
330 | 70 | 194 | 1 | 2
348 | 70 | 212 | 3 | 2
339 | 70 | 203 | 2 | 2
331 | 70 | 195 | 1 | 3
349 | 70 | 213 | 3 | 3
358 | 70 | 222 | 4 | 3
到目前为止,用于拉取的查询非常有效:
query = from at in ReleaseTrack,
distinct: true,
join: s in ReleaseSide, on: [release_side_id: s.release_side_id],
join: a in Release, on: [release_id: at.release_id],
where: a.active == true,
where: at.release_id == ^release_id,
Repo.all(query)
我完全理解了所有这些行
但是,我想转换输出的内容:
[
%App.ReleaseTrack{
__meta__: #Ecto.Schema.Metadata<:loaded, "release_tracks">,
inserted_at: ~N[2021-05-26 00:30:34],
release_id: 70,
release_side_id: 1,
release_sides: %App.ReleaseSide{
__meta__: #Ecto.Schema.Metadata<:loaded, "release_sides">,
inserted_at: ~N[2021-05-26 00:30:34],
order_number: 1,
release: #Ecto.Association.NotLoaded<association :release is not loaded>,
release_id: 70,
release_side: "Disc 1",
release_side_id: 1,
updated_at: ~N[2021-05-26 00:30:34]
},
release_track_id: 329,
track: %App.Track{
__meta__: #Ecto.Schema.Metadata<:loaded, "tracks">,
track_id: 211,
bpm: 60,
title: "Ghosts",
...
}
],
...
如果release\u side\u id
指向Disc 1
,如上面的输出,并且[track1,track2,track3]
表示每个%App.Track{}
结果
本质上,一个关键字对查看表:
%{release\u side\u id=>[track\u id data,track\u id data]}
不管我做不到什么,我都不能让它工作。在Ruby世界中:
tracks = {}
results.each do |result|
side_name = result["release_side_id"]
tracks[:release_side_id] ||= []
tracks[:release_side_id] << results["track_id"]
end
tracks={}
结果。每个都有结果|
侧面名称=结果[“发布侧面id”]
音轨[:释放_侧_id]| |=[]
曲目[:release_side_id]Enum.group_by
应有助于:
Repo.all(query)
|> Enum.group_by(fn x -> x.release_id end, fn t -> t.track end)
解决了吗?太棒了,是的,谢谢你。在阅读您的答案之前,我刚刚尝试了Enum.group\u by(fn x->x.release\u side\u id end)
,它也起了作用。订单也保留了!非常感谢。
Repo.all(query)
|> Enum.group_by(fn x -> x.release_id end, fn t -> t.track end)