如何仅从ecto模型中获取字段?

asi*_*niy 6 elixir ecto

假设我有一个模型,就像那样:

defmodule User do
  use MyApp.Web, :model

  schema "users" do
    field :email, :string
    field :first_name, :string

    belongs_to :role, Role
    has_many :comments, Comment
  end
end
Run Code Online (Sandbox Code Playgroud)

用户结构将由关联和字段表示,如下所示:

model = %User{
  __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
  comments: #Ecto.Association.NotLoaded,
  email: "alex@google.com",
  first_name: "alex",
  role: #Ecto.Association.NotLoaded
}
Run Code Online (Sandbox Code Playgroud)

如何仅使用字段来获取基于此结构的地图?

asi*_*niy 17

Ecto定义__schema__模型的功能.因此,您可以使用此函数获取字段:

fields = User.__schema__(:fields)
Run Code Online (Sandbox Code Playgroud)

然后使用 Map.take/2

Map.take(model, fields)
Run Code Online (Sandbox Code Playgroud)