尝试使用 Ecto 查询执行一个简单的 where in,但 where 部分转换为 TRUE


def all_for_me(query, user_id) do
    friends = Repo.all(from f in Friendship, where: f.user_id == ^user_id and f.status == 2, select: f.friend_id)
    from p in query,
      where: p.privacy == "public" or (p.privacy == "friends" and p.user_id in ^friends),
    select: p,
    order_by: [desc: p.inserted_at]
  end

OR或(p.privacy =="朋友"和^friends中的p.user_id)部分显示为((p0)。隐私" = "朋友") 和错误))

我错过了什么? 我知道已经很晚了,我可能已经太久了,但需要在睡前破解它!

最有可能的是,friends是一个空列表。从下面的 REPL 会话中,x in ^[] 在原始 SQL 中有效地转换为false

iex(7)> TestProject.User |> where([x], x.id in ^[Ecto.UUID.generate])  |> Repo.all
[debug] SELECT u0."id", u0."name", u0."email", u0."password_hash", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."id" IN ($1)) [<<98, 168, 63, 177, 44, 237, 76, 176, 148, 149, 173, 48, 68, 96, 235, 60>>] OK query=1.2ms
[]
iex(8)> TestProject.User |> where([x], x.id in ^[])  |> Repo.all                  
[debug] SELECT u0."id", u0."name", u0."email", u0."password_hash", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (false) [] OK query=1.1ms
[]

最新更新