elixir – 如何在Repo.one中使用Repo.get和select之类的

我不确定这是可能的,但我喜欢Repo.get返回一个Struct的事实.

我正在尝试做类似的事情:

Repo.get(User, id, select: [:id, :name])

像:

Repo.one(from u in User, where: u.id == ^id, select: [u.id, u.name]

但是使用Repo.get,我无法从Ecto文档中找出是否有可能以及如何实现这一目标.

上下文:我正在使用Guardian,序列化程序执行以下操作:

def from_token("User:" <> id), do: {:ok, Repo.get(User, id,)}

因此,当我调用current_resource(conn)时,我得到了一个方便的用户结构.但是这个查询返回我正在尝试过滤的数据库的所有用户信息(例如我不想在current_resource(conn)中加密密码.

最佳答案 正如@Dogbert在评论中提到的解决方案是:

import Ecto.Query

from(User) |> select([:id, :name]) |> Repo.get(id)

在监护人序列化器里面:

import Ecto.Query

....

def from_token("User:" <> id), do: {:ok, from(User) |> select([:id, :name]) |> Repo.get(id)}

.....

来自Ecto.Repo文档:

get(queryable, id, opts)
get(queryable :: Ecto.Queryable.t, id :: term, opts :: Keyword.t) ::
Ecto.Schema.t |
nil |
no_return

Fetches a single struct from the data store where the primary key matches the given id.

Returns nil if no result was found. If the struct in the queryable has no or more than one primary key, it will raise an argument error.

提到get / 3等待的第一个参数是可查询的.这就是我们可以使用from(User)|>构造可查询的原因. select([:id,:name])然后将其传递给Repo.get(id)

这将返回基于用户模型的结构.

正如phoenix-framework docs所提到的那样:

Each model defines the fields of our schema as well as their types.
They each define a struct with the same fields in our schema.

因此,返回的结构将具有模型/模式中描述的所有字段,但是具有nil值,我们不会选择它们.

点赞