回购查询的案例陈述

时间:2018-01-20 22:54:35

标签: elixir phoenix-framework

我有一个cronjob,每天晚上9点运行一个功能。这个函数做的第一件事是进行ecto查询。但是,查询有可能返回空白。如果它发生,我希望能够处理这种情况。

当前的尝试:

def check_question(conn, _params) do
  case Repo.get_by(Question, active: true, closed: true) do

  question ->

  _ ->

  end
end

但这不起作用,因为如果查询为nil则会抛出此错误:

ERROR:

function nil.game_id/0 is undefined or private 

它基本上试图检查下一个函数中的零问题,但显然它会因为问题为零而中断。

如果repo查询返回nil,如何将其路由到_ case?

1 个答案:

答案 0 :(得分:3)

凯斯将尝试从上到下进行匹配。所以在你的代码中,首先尝试匹配nil,然后尝试匹配nil。如果你想匹配结果不是nil的情况,请使用when not is_nil(question)

def check_question(conn, _params) do
  case Repo.get_by(Question, active: true, closed: true) do

  question when not(is_nil(question)) ->

  _ ->

  end
end

或没有when

def check_question(conn, _params) do
  case Repo.get_by(Question, active: true, closed: true) do
   nil -> ... case when result is nil
  question ->
     ... case when there is result
  end
end

还有一件事,无论何时编写没有任何分解或布尔检查的情况,它都与数学_ -> ...表达式相同。 _question之间的区别仅在于您不希望将匹配值分配给局部变量。因此,在您的尝试中,_ ->将匹配NEVRER,因为question -> ...将始终匹配,并且两种情况实际上都是相同的表达式。当您尝试编译该文件时,您可能会在控制台中看到该警告。所以总是尝试分解并检查/匹配表达式中的某些值!