我正在使用Phoenix和Ecto通过主键查询数据库中的单个记录。所有文档/示例都显示了Phoenix Controller中的用法:
def show(conn, %{"id" => id}) do
m = Repo.get(MyModel, id)
...
end
然而,Phoenix中的所有参数都是字符串,所以这会引发** (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?
答案 0 :(得分:1)
您的代码是正确的。在即将推出的Ecto版本中,我们希望为这样的案例添加自动投射。但是现在,你需要手动投射它。
答案 1 :(得分: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.