Elixir 从EXTO查询映射到关键字列表

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 |

我一直在RubyonRails世界中学习长生不老药

我有下表:

 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)