使用字符串查询回购

时间:2014-12-17 18:13:16

标签: elixir phoenix-framework ecto

我正在使用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?

2 个答案:

答案 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.