使用字符串查询回购

问题描述 投票:4回答:2

我使用Phoenix和Ecto通过主键查询数据库中的单个记录。所有文档/示例都显示了Phoenix Controller中的用法:

def show(conn, %{"id" => id}) do
  m = Repo.get(MyModel, id)

  ...
end

然而,凤凰城的所有参数都是字符串,所以这会抛出一个** (Ecto.InvalidModel) model App.MyModel failed validation when , field id had type string but type integer was expected。我一直在我的控制器中解决这个问题:

def show(conn, %{"id" => id}) do
   m = String.to_integer(id) |> find_my_model_by_id

  ...
end

defp find_my_model_by_id(id) do
 Repo.get(MyModel, id)
end

问题是我没有看到其他人进行这种类型转换。我担心我没有正确安装Phoenix或Ecto。是否有我错过的Phoenix / Ecto约定会自动强制我的Repo.get/2的id参数为int?

elixir phoenix-framework ecto
2个回答
1
投票

你的代码是正确的。在即将推出的Ecto版本中,我们希望为这样的案例添加自动投射。但是现在,您需要手动投射它。


0
投票

尝试在Ecto 2.2.0上,它仍然不会在我的查询中自动将字符串转换为整数

where: u.user_id == ^user_id,

得到错误:

(ArgumentError) Postgrex expected an integer in -9223372036854775808..9223372036854775807, got "33133". Please make sure the value you are passing matches the definition in your table or in your query or convert the value accordingly.
© www.soinside.com 2019 - 2024. All rights reserved.