【问题标题】:Preload with elixir and phoenix预装丹药和凤凰
【发布时间】:2016-12-23 16:25:42
【问题描述】:

我在尝试与数据库中的用户创建会话时遇到此错误。我的用户架构 has_many 项目所以当我尝试创建会话时出现此错误

projects: #Ecto.Association.NotLoaded<association :projects is not loaded>

我想我明白它在说什么,但我不知道在哪里预加载数据以便页面在此处呈现是我收到的完整错误。

defmodule PerriAir.Router do
 use PerriAir.Web, :router
 use Honeybadger.Plug
 use ExAdmin.Route    

 pipeline :browser do



protocol Enumerable not implemented for %PerriAir.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">, id: 8, inserted_at: #Ecto.DateTime<2016-12-23 15:38:38>, password: nil, password_hash: "$2b$12$NxLaK3ZUVPLE23E1L.64GOjm7FtTLemXPUXsp6gSAP346is8e6d5e", projects: #Ecto.Association.NotLoaded<association :projects is not loaded>, updated_at: #Ecto.DateTime<2016-12-23 15:38:38>}

我是 elixir 和 phoenix 的新手,因此对于此错误的任何帮助将不胜感激!

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    你在哪里获取user,你需要明确地 preload关联:projects,所以在控制器中你大概有这样的东西:

    user = Repo.get(User, user_id)
    

    这必须变成类似的东西:

    user =
      User
      |> Repo.get(user_id)
      |> Repo.preload(:projects)
    

    请注意,代码已格式化,为清楚起见,此处使用pipe operator。相当于它是这样的:

    user = Repo.preload(Repo.get(User, user_id), :projects)
    

    我在这里添加了这个,因为你提到你是 elixir 的新手

    如果您想了解更多关于Ectopreload 的信息,请看这里:https://hexdocs.pm/ecto/Ecto.Repo.html#c:preload/3

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 2021-01-29
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多