在链接时间的this talk中,演讲者描述了如何通过虚拟转换(例如,通过转换函数)将变更集管道化,从而基于虚拟字段自动在Ecto.Schema中设置字段:
defmodule MusicDb.Track do
use Ecto.Schema
schema "tracks" do
field :title, :string
field :duration, :integer
field :duration_string, :string, virtual: true
timestamps()
end
def changeset(track, attrs) do
track
|> validate...
|> convert_duration_string
end
end
例如,这用于将3:25的用户输入转换为205。
我如何做另一个方向?当我从Track
查询Repo
时,虚拟字段duration_string
为nil
。查询特定结构的架构时,如何安装自动计算和设置虚拟字段的功能?
取决于您需要的位置,您可以将任何这样的计算字段添加到序列化程序中(例如defimpl Jason.Encoder
),也可以在抽象模块中定义必要的修饰(例如在Phoenix环境中)。 Elixir论坛中的讨论可能是相关的:https://elixirforum.com/t/computed-fields-for-an-ecto-model/3537/12