Order_by не работает с динамическими c запросами - PullRequest
0 голосов
/ 09 апреля 2020

Я хотел использовать order_by в запросе с Dynami c, следуя примерам из здесь :

def filter(params) do
  Post
  |> order_by(^filter_order_by(params["order_by"]))
end

def filter_order_by("published_at_desc"),
  do: dynamic([p], desc: p.published_at)

Однако я получаю:

** (Ecto.Query.CompileError) Tuples can only be used in comparisons with literal tuples of the same size
    (ecto 3.1.7) expanding macro: Ecto.Query.dynamic/2
    (elixir 1.10.0-rc.0) lib/kernel/parallel_compiler.ex:233: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/7

Существует также второй вариант в их примерах:

def filter_order_by("published_at_desc"),
  do: [desc: dynamic([p], p.published_at)]

Это не вызывает ошибки при компиляции, но вместо этого во время выполнения:

** (exit) an exception was raised:
    ** (ArgumentError) expected a field as an atom, a list or keyword list in `order_by`, got: `dynamic([c], c.inserted_at)`
        (ecto 3.1.7) lib/ecto/query/builder/order_by.ex:105: Ecto.Query.Builder.OrderBy.field!/2
        (ecto 3.1.7) lib/ecto/query/builder/order_by.ex:115: anonymous fn/2 in Ecto.Query.Builder.OrderBy.order_by!/2
        (elixir 1.10.0-rc.0) lib/enum.ex:1396: Enum."-map/2-lists^map/1-0-"/2
...