添加到每个可枚举的计算值

Add to each enumerable a calculated value

我正在尝试从数据库中获取“work_items”,计算一个值,将其添加到相应的 work_item 然后继续,但我不明白为什么它没有工作:

import Ecto.query, warn: false

  def list_work_items do
    WorkItem
    |> select_merge([work_item], %{value: ^work_item_value(work_item)})
    |> Repo.all()
  end

  defp work_item_value(work_item) do
    work_item.duration_in_minutes/60 * work_item.hourly_rate_in_cents
  end

当我 运行 mix phx.server 我得到:

warning: variable "work_item" does not exist and is being expanded to "work_item()", please use parentheses to remove the ambiguity or change the variable name
  lib/fourty/tracking.ex:22: Fourty.Tracking.list_work_items/0


== Compilation error in file lib/fourty/tracking.ex ==
** (CompileError) lib/fourty/tracking.ex:22: undefined function work_item/0
...

22select_merge.

我有 googelt 并尝试了文档,但无法弄清楚为什么它不起作用。帮助将不胜感激。

我想通了 - 解决方案是使用虚拟字段:

field :value, :float, virtual: true

然后使用:

  def list_work_items do
    WorkItem
    |> select_merge([work_item], %{value: fragment("?/60 * ?"), work_item.duration_in_minutes, work_item.hourly_rate_in_cents})
    |> Repo.all()
  end