使用 Ecto.Repo.update_all/3 插入 NULL 值
Inserting NULL value with Ecto.Repo.update_all/3
假设我们有一个名为 users
的 table,它有一个可为空的列 permission_set_id
,它是另一个名为 permission_sets
的 table 的外键,实现了使用 Ecto.Schema.belongs_to/3
(docs here) 宏。我需要用这样的查询使该字段无效:
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
、:nilify
和 false
不起作用,表示无法将其转换为整数值。
有什么想法吗?我检查了 tests,但到目前为止没有发现任何接近的东西。
谢谢。
看起来像是测试中的一个简单错误。
您正在创建两个用户:
user
(可能是工厂分配的权限)
tight_user
(明确分配权限)
- 删除
user
的权限
- 查询
tight_users
权限并期望它在您从未删除它时为零,因为您正在删除 user
权限。
假设我们有一个名为 users
的 table,它有一个可为空的列 permission_set_id
,它是另一个名为 permission_sets
的 table 的外键,实现了使用 Ecto.Schema.belongs_to/3
(docs here) 宏。我需要用这样的查询使该字段无效:
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
、:nilify
和 false
不起作用,表示无法将其转换为整数值。
有什么想法吗?我检查了 tests,但到目前为止没有发现任何接近的东西。
谢谢。
看起来像是测试中的一个简单错误。
您正在创建两个用户:
user
(可能是工厂分配的权限)tight_user
(明确分配权限)- 删除
user
的权限
- 查询
tight_users
权限并期望它在您从未删除它时为零,因为您正在删除user
权限。