Elixir map check如果不为空且密钥存在

时间:2015-10-24 15:14:32

标签: elixir phoenix-framework ecto

我试图找出一种方法来检查凤凰应用程序(使用Elixir)中的params散列是否有特定的密钥。

在模型中的以下变更集功能中,参数默认为:空。

def changeset(model, params \\ :empty) do

我需要弄清楚哈希是否存在名为:username的密钥。

2 个答案:

答案 0 :(得分:17)

只是一个小术语,params是一个地图而不是哈希。知道在文档中查找的位置时,这是相关的。

对于地图,has_key?/2会返回truefalse

Map.has_key?(params, :name)

由于您使用的是Ecto变更集,因此您也可以使用Ecto.Changeset.get_change/3

get_change(changeset, key, default \\ nil)

如果未设置default,则返回key。请注意,如果key设置为nil,则仍会返回nil。如果nil是您允许的更改值,那么您可能需要设置不同的默认参数。

答案 1 :(得分:9)

Gazeler的回答显然非常好。我只会在混合中添加模式匹配,在我看来,这是最清晰的解决方案,不仅适用于凤凰,而且适用于Elixir中的任何地图。

# head-only declaration for default params
def changeset(model, params \\ :empty)

def changeset(model, %{"username" => _} = params) do
  # username field is in params
end

def changeset(model, params) do
  # username is not in params
end