首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Elixir凤凰中动态创建JSON-api关系

在Elixir凤凰中动态创建JSON-api关系
EN

Stack Overflow用户
提问于 2016-10-16 15:36:23
回答 1查看 414关注 0票数 0

我们有相当多的测试,在这些测试中,我们手动地设置了关系。我们所做的事情如下:

代码语言:javascript
复制
defp build_relationships(relationship_map, user) do
  relationship_map |> Map.put(:user, %{data: %{id: user.id}})
end

这很好,但我想让它灵活地接受任何类型的记录(不仅仅是用户)。作为参考,user是以ex-machina作为insert(:user)创建的。

有什么方法可以获得传入的记录的type吗?如果我能得到一个字符串,上面写着"user",我可以使用String.to_atom(param)并把它传递给Map.put,但是我找不到一种优雅的方法来完成这个任务。

真正的问题是如何获取像user这样的记录,并返回一个原子的:user

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-16 16:37:37

您可以使用.__struct__.__schema__/1获取有关Ecto结构的一些信息,例如:

代码语言:javascript
复制
iex(1)> %Post{}.__struct__.__schema__(:source)
"posts"

但是,由于没有从模式到ExMachina工厂的1:1映射,所以我可以想到三种可能的方法:

  1. 将工厂重命名为使用复数形式,与表名相同,并使用.__struct__.__schema__(:source)获取名称。这将使您的工厂代码读起来有点奇怪,因为您将使用insert(:users)插入一个用户。
  2. 继续使用单数名称,但使用一些库将复数表名转换为单数表名,例如将"users"转换为"user",将"posts"转换为"post"
  3. 保持Schema <->工厂名称映射的列表,如下所示(或者您甚至可以将映射移动到单独的函数): defp build_relationships( relationship_map,struct) do end = %{MyApp.User => :user,MyApp.Post => :post} # add relationship_map |> Map.put(mappingstruct.__struct__,%{data:%{id: struct.id})结束
  4. 使用Module.split/1获取模型的名称,并使用Macro.underscore/1将其转换为小写+加下划线的名称,然后使用String.to_existing_atom: defp build_relationships( relationship_map,struct) do name = struct.__struct__ |> Module.split |> List.last |> Macro.underscore |> String.to_existing_atom relationship_map |> Map.put(name,%{data:%{id: struct.id})结束 如果您使用嵌套模块作为模型,例如MyApp.Something.User,这将无法正常工作。

如果你所有的模型都在相同的嵌套层次上,我会选择4,如果你想要更明确的话,我会选择3。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40072066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档