【发布时间】:2016-07-11 20:59:31
【问题描述】:
我有一个简单的模型(短版):
defmodule MyApp.User do
use Ecto.Model
@derive {Poison.Encoder, only: [:id, :name, :email]}
schema "users" do
field :name, :string
field :email, :string
belongs_to :company, MyApp.Company
我希望 @derive 在尝试对模型进行编码时排除 :company 关联,但似乎没有。使用 Guardian 序列化程序时会发生这种情况:
defmodule MyApp.GuardianSerializer do
@behaviour Guardian.Serializer
alias MyApp.Repo
alias MyApp.User
def for_token(user = %User{}), do: { :ok, "User:#{user.id}" }
def for_token(_), do: { :error, "Unknown resource type" }
def from_token("User:" <> id), do: { :ok, Repo.get(User, id) }
def from_token(_), do: { :error, "Unknown resource type" }
end
我实际上并不确定会发生什么
def for_token(user = %User{}), do: { :ok, "User:#{user.id}" }
据我了解,user = %User{} 正在尝试测试作为参数给出的对象是否是有效的 User 变更集,对吗?
但是我得到了这个错误:
无法将关联 :company 从 MyApp.User 编码为 JSON,因为 关联未加载。请确保您已预加载 关联或从要编码的数据中删除
我不想预加载它,因为它需要更多的依赖来编码,这也不起作用,我宁愿忽略它。
为什么@derive 中的only 参数不起作用,我该如何解决这个问题?
【问题讨论】:
-
如果您执行
Poison.encode!(Repo.get(User, 1))(将 1 替换为有效的用户 ID),您是否会收到相同的错误? -
我已经更新了问题并添加了一些上下文。是的,如果我尝试直接使用
Poison.encode!/1对其进行编码,也会出现同样的问题 -
我无法用类似的设置重现这个:
Commentbelongs_toPost;Poison.encode!(Repo.get(Comment, 1))与@derive {Poison.Encoder, only: [:id, :content]}在Comment。您可以尝试在新的最小应用程序中重现该错误吗? -
你在预加载关联吗?如果我预加载它,错误将继续与未预加载的
Company关联...但我不想预加载或编码其中任何一个。 -
是的,即使这样也能正常工作:
Poison.encode! MyApp.Repo.get(MyApp.Comment, 2) |> MyApp.Repo.preload([:post])与我在上一条评论中发布的@derive相同。
标签: elixir ecto elixir-poison