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