【问题标题】:Pattern Match parameters in a changeset变更集中的模式匹配参数
【发布时间】:2026-01-19 01:50:01
【问题描述】:

我想在我的一个模式中有两个变更集子句,根据传入的参数数量进行匹配。

第一个变更集只有在名称和 vendor_id 存在(并且没有其他字段)时才会匹配。

Product.changeset(struct, %{ name: name, vendor_id: vendor_id })

第二个变更集将匹配其他所有内容:

Product.changeset(struct, params)

不幸的是,当namevendor_id 和其他参数被传递时,第一个变更集被调用。

我不确定如何构建变更集,以便它们按照我的意愿行事。

【问题讨论】:

    标签: pattern-matching elixir phoenix-framework


    【解决方案1】:

    您可以为此使用map_size/1 作为守卫。不是一个非常优雅的解决方案(您需要在防护中硬编码大小),但由于模式匹配映射忽略了额外的字段,我想不出更好的方法。

    def changeset(struct, %{name: name, vendor_id: vendor_id} = params) when map_size(params) == 2 do
      ...
    end
    def changeset(struct, params) do
      ...
    end
    

    【讨论】: