埃克托 | 如何获取应用程序中的所有架构模块

And*_*yKo 6 elixir ecto phoenix-framework

我正在尝试创建一个混合任务来自动化一些脚手架,并且我想获取应用程序中具有架构和嵌入架构实现的所有模块名称的列表。最终我想要一个包含字段定义的所有模式的列表,而不仅仅是模块名称。我们能得到它吗?如果是的话,ecto 如何提供这样的 api?

Vad*_*nda 9

根据Ecto.Schema的文档,

任何模式模块都会生成__schema__可用于模式的运行时自省的函数。

您可以将其与 Erlang 和 Elixir 自己的自省工具一起使用,以过滤所有相关模块并巧妙地检索任何已定义模式的详细信息,例如:

{:ok, modules} = :application.get_key(:your_app, :modules)

modules 
|> Enum.filter(&({:__schema__, 1} in &1.__info__(:functions))) 
|> Enum.each(&(IO.inspect(&1.__schema__(:fields))))
Run Code Online (Sandbox Code Playgroud)