模式在变更集中匹配参数

时间:2017-10-26 03:25:04

标签: pattern-matching elixir phoenix-framework

我希望在我的一个模式中有两个changeset子句,这些子句根据传入的参数数量进行匹配。

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

Product.changeset(struct, params)

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

name

不幸的是,当传递vendor_id和{{1}}以及其他参数时,会调用第一个变更集。

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

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