我希望在我的一个模式中有两个changeset子句,这些子句根据传入的参数数量进行匹配。
第一个变更集仅在名称和vendor_id存在时才匹配(并且没有其他字段)。
Product.changeset(struct, params)
第二个变更集将匹配其他所有内容:
name
不幸的是,当传递vendor_id
和{{1}}以及其他参数时,会调用第一个变更集。
我不确定如何构建变更集,以便他们按照我的意愿行事。
答案 0 :(得分:3)
您可以在警卫中使用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