【问题标题】:Case statement for Repo Query回购查询的案例陈述
【发布时间】:2018-01-21 07:28:23
【问题描述】:

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

当前尝试:

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

  question ->

  _ ->

  end
end

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

错误:

function nil.game_id/0 is undefined or private 

它基本上是在尝试检查下一个函数中的 nil 问题,但显然它会中断,因为问题是 nil。

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

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    案例将尝试从上到下匹配。因此,在您的代码中,首先尝试匹配 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
    

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

    【讨论】:

      猜你喜欢
      • 2015-05-17
      • 1970-01-01
      • 2023-04-10
      • 2010-10-30
      • 2016-05-13
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      相关资源
      最近更新 更多