Учитывая следующую схему, я хочу вычислить: games_won /: games_played, заполнить ее в: процент_вон и отсортировать по: процент_вон. Мне удалось вычислить значение, если я использую select_merge
и опускаю «AS?», Но как мне ссылаться на этот вычисленный столбец в order_by
?
schema "players" do
field :name, :string
field :games_played, :integer
field :games_won, :integer
field :percentage_won, :float, virtual: true
timestamps()
end
Я попробовал следующий запрос:
def list_players(sort_by, sort_order) do
query =
from(p in Player,
select_merge: %{percentage_won: fragment("(?::decimal / NULLIF(?,0)) AS ?", p.games_won, p.games_played, p.percentage_won)},
order_by: [{^sort_order, field(p, ^String.to_atom(sort_by))}])
Repo.all(query)
end
Но при вызове list_players("percentage_won", :asc)
выдается следующая ошибка:
** (Ecto.QueryError) ...:28: field `percentage_won` in `select` is a virtual field in schema Player in query:
from p0 in Player,
order_by: [asc: p0.name],
select: merge(p0, %{percentage_won: fragment("(?::decimal / NULLIF(?,0)) AS ?", p0.games_won, p0.games_played, p0.percentage_won)})