用长生不老药和凤凰预加载

时间:2016-12-23 16:25:43

标签: elixir phoenix-framework

当我尝试与数据库中的用户创建会话时,我遇到了此错误。我的用户架构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的新手,所以对此错误的任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:5)

在您提取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 的新手。

如果您想详细了解Ecto preload,请查看此处:https://hexdocs.pm/ecto/Ecto.Repo.html#c:preload/3

希望有所帮助!

相关问题