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

Bit*_*ise 1 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>}
Run Code Online (Sandbox Code Playgroud)

我是elixir和凤凰的新手,所以对此错误的任何帮助都将不胜感激!

Paw*_*zak 5

在你提取的地方user,你需要明确地 preload联系:projects,所以在控制器中你可能有类似的东西:

user = Repo.get(User, user_id)
Run Code Online (Sandbox Code Playgroud)

这必须转向:

user =
  User
  |> Repo.get(user_id)
  |> Repo.preload(:projects)
Run Code Online (Sandbox Code Playgroud)

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

user = Repo.preload(Repo.get(User, user_id), :projects)
Run Code Online (Sandbox Code Playgroud)

我在这里补充说,因为你已经提到你是灵丹妙药的新手.

如果你想了解更多关于Ecto's的信息preload,请看一下:https://hexdocs.pm/ecto/Ecto.Repo.html#c:predeload/3

希望有所帮助!