Elixir 如何在Repo.one中使用Repo.get和select like
我不确定这是否可行,但我喜欢Repo.get返回结构的事实 我试着做一些类似的事情:Elixir 如何在Repo.one中使用Repo.get和select like,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我不确定这是否可行,但我喜欢Repo.get返回结构的事实 我试着做一些类似的事情: Repo.get(User, id, select: [:id, :name]) def from_token("User:" <> id), do: {:ok, Repo.get(User, id,)} 例如: Repo.one(from u in User, where: u.id == ^id, select: [u.id, u.name] 但是对于Repo.get,我无法从EXTO文档
Repo.get(User, id, select: [:id, :name])
def from_token("User:" <> id), do: {:ok, Repo.get(User, id,)}
例如:
Repo.one(from u in User, where: u.id == ^id, select: [u.id, u.name]
但是对于Repo.get,我无法从EXTO文档中判断它是否可能以及如何实现这一点
上下文:我正在使用Guardian,序列化程序执行以下操作:
Repo.get(User, id, select: [:id, :name])
def from_token("User:" <> id), do: {:ok, Repo.get(User, id,)}
def from_令牌(“用户:”id),do:{:确定,Repo.get(用户,id,)}
因此,当我调用
current\u resource(conn)
时,我会得到一个方便的用户结构。但此查询返回我试图筛选的数据库中用户的所有信息(例如,我不希望在我的当前\u资源(conn)
中使用加密密码),正如@Dogbert在注释中提到的,解决方案是:
import Ecto.Query
from(User) |> select([:id, :name]) |> Repo.get(id)
在guardian序列化程序中:
import Ecto.Query
....
def from_token("User:" <> id), do: {:ok, from(User) |> select([:id, :name]) |> Repo.get(id)}
.....
导入外部查询
....
def from_token(“User:”id),do:{:确定,from(User)|>select([:id,:name])|>Repo.get(id)}
.....
从文档中:
get(可查询、id、opts)
get(queryable::exto.queryable.t,id::term,opts::Keyword.t)::
异位模式|
零|
不归
从主键与给定id匹配的数据存储中获取单个结构
如果未找到结果,则返回nil。如果查询表中的结构没有或有多个主键,则将引发参数错误
如前所述,get/3
等待的第一个参数是一个查询表。这就是为什么我们可以使用from(User)|>select([:id,:name])
构造查询表,然后将其传递给Repo.get(id)
这将返回基于用户
模型的结构
正如上面提到的:
每个模型都定义了模式的字段及其类型。
它们各自使用模式中相同的字段定义一个结构
因此,返回的结构将在模型/架构中描述所有字段,但在我们不选择它们的情况下使用nil值。因此,您需要一个包含
id
和name
的列表,而不是一个结构,如果给定用户不存在,但使用Repo.get
,则使用nil
?我想要一个结构/n我喜欢Repo.get。列表不是“期望的行为”。id和名称只是示例。如文档中所述,Repo.get正在返回一个结构,而Repo.one不返回。但是我可以将select与Repo.one一起使用,我不知道如何将select与Repo.get一起使用。因此,您想要一个结构,但只返回特定字段?结构的其余字段应该是nil
,然后再试一次(您可能需要导入exto.Query
):from(User)|>select([:id,:name])|>Repo.get(id)
(我不确定为什么会这样做,但它似乎起作用。)