我使用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?
你的代码是正确的。在即将推出的Ecto版本中,我们希望为这样的案例添加自动投射。但是现在,您需要手动投射它。
尝试在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.