Elixir Ecto query - сохранение порядка вывода - PullRequest
0 голосов
/ 20 января 2020

У меня есть список идентификаторов ["123", "321", "101"]

И запрос segments = Repo.all(from(s in Segment, where: s.id in ^ids))

Вывод моих совпадающих сегментов не в том порядке, как в списке. Например, если бы это было Enum.map, то порядок был бы сохранен. Есть ли способ, которым я могу сделать это, используя только один запрос, без необходимости делать что-то вроде Enum.each?

1 Ответ

2 голосов
/ 20 января 2020

Вот моя попытка конвертировать один из ответов из комментария @ zwipp ie в Ecto (для Postgres):

defmodule Segment do
  ...

  def by_id_in_order(query, ids) do
    query
    |> join(:inner, [s], o in fragment("SELECT * FROM UNNEST(?::int[]) WITH ORDINALITY AS o (id, ordinal)", ^ids), on: s.id == o.id)
    |> order_by([s, o], asc: o.ordinal)
  end
end

Используется как

Segment
|> Segment.by_id_in_order([123, 321, 101])
|> Repo.all()
...