【问题标题】:Why does this code always pull from the database?为什么这段代码总是从数据库中提取?
【发布时间】:2021-03-08 13:43:54
【问题描述】:

当我导航到不同的页面时,总是执行数据库查询,但我希望它只在第一次执行,然后将 firstName 存储在会话变量中。

 defp get_first_name(conn, %{email: email}) do
    firstName = if sessionFirstName = get_session(conn, :firstName) do
      # found firstName in the session conn variable
      sessionFirstName
    else
      user_record = EVALUsers.get_eval_user_by_email!(email)

      %{firstName: firstName} = user_record
      firstName
    end

    if firstName do
      conn
      |> assign(:firstName, firstName)
      |> put_session(:firstName, firstName)
    else
      conn
      |> assign(:firstName, email)
      |> put_session(:firstName, email)
    end
  end

提前致谢! 斯科特

【问题讨论】:

    标签: database elixir phoenix-framework ecto


    【解决方案1】:

    请记住,= 在 Elixir 中是匹配运算符,而不是赋值运算符。请注意,您的第一个 if 语句具有匹配运算符,而不是 == 条件运算符。

    第一次执行您的函数时,sessionFirstName 包含一个 nil 值。 get_session() 调用还返回一个 nil 值,因为在会话中找不到 :firstName 键。因此,第一个if 中的匹配运算符找到了一个匹配项,这导致条件计算为true。这导致它返回sessionFirstName 的值,即nil,并将其放入firstName 变量中。最后一个if语句发现firstName的值为nil,这是错误的,所以它评估else并将email变量的值存储在会话中。

    下次执行您的函数时,sessionFirstName 再次包含 nil 值。 if 语句将get_session() 调用的返回值(这一次应该实际返回一个值)与sessionFirstName 的值进行比较,发现它们不匹配。这会导致else 子句被执行,并且您的数据库被命中,并且返回的值被放入会话中。此后,由于会话返回一个值但sessionFirstName 包含nil,因此本段中描述的操作每次都会执行。

    我的建议是使用cond 结构来测试各种可能性。

    defp get_first_name(conn, %{email: email}) do
      firstName =
        cond do
          sessionFirstName = get_session(conn, :firstName) ->
            sessionFirstName
          %{firstName: firstName} = EVALUsers.get_eval_user_by_email!(email) ->
            firstName
          true ->
            email
        end
    
      conn
      |> assign(:firstName, firstName)
      |> put_session(:firstName, firstName)
    end
    

    【讨论】:

    • 布莱恩,感谢您的帮助。将第一行中的 = 更改为 == 是错误的,因此我对您提出的如何解决问题的建议感到困惑。
    • 我已经编辑了我的答案以包含一些建议的代码修改。
    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 2023-03-28
    • 1970-01-01
    • 2016-11-14
    • 2016-02-21
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多