使用Ecto.Repo.update_all / 3插入NULL值

时间:2016-09-19 20:39:49

标签: postgresql elixir ecto

假设我们有一个名为users的表,其中包含可为空的列permission_set_id,该列是另一个名为permission_sets的表的外键,使用Ecto.Schema.belongs_to/3(docs { {3}})宏。我需要用这样的查询来取消该字段:

query = from u in User,
        where: u.id == ^user_id

case Repo.update_all(query, set: [permission_set_id: nil]) do
  {1, _terms} -> send_resp(conn, :no_content, "")
  {0, _terms} -> send_resp(conn, :not_found, "User not found.")
end

然而,这个单元测试失败了:

test "unassigns user's permission set", %{conn: conn} do
  user = Factory.insert(:user)
  permission_set = Factory.insert(:permission_set, user_id: user.id)
  tight_user = Factory.insert(:user, permission_set_id: permission_set.id)

  conn = delete conn, user_user_permission_set_path(conn, :delete, user)

  query = from u in User,
    where: u.id == ^tight_user.id,
    select: u.permission_set_id

  assert response(conn, 204)
  refute Repo.one(query)
end

结果

test unassigns user's permission set (SpheriumWebService.UserPermissionSetControllerTest)
test/controllers/user_permission_set_controller_test.exs:96

Expected false or nil, got 94
code: Repo.one(query)
stacktrace:
  test/controllers/user_permission_set_controller_test.exs:108: (test)

我尝试将值设置为fragment("NULL"),发现我无法在那里使用它。值:null:nilifyfalse不起作用,表示无法将其转换为整数值。

有什么想法吗?我已经检查了here,但到目前为止没有找到任何结果。

谢谢。

1 个答案:

答案 0 :(得分:1)

在测试中看起来像是一个简单的错误。

您正在创建两个用户:

  • user(可能是工厂为其分配权限)
  • tight_user(您明确指定权限的地方)
  • user
  • 删除权限
  • 查询tight_users权限,并且在您从未删除它时期望它为零,因为您正在删除user权限。