我如何加入长生不老药中的 Repo.find_by()

how do I join in an Repo.find_by() in elixir

我需要查找一个用户,但还要与另一个 table(合作伙伴)一起加入。这是没有连接的工作代码:

result = Repo.get_by(User, login: auth.info.email)

用户 table 与合作伙伴 table 有一个外键,所以我想试试这个:

result = Repo.get_by(User, %{ login: auth.info.email, join: :partner } )

但这会导致:

field `User.join` in `where` does not exist in the schema in query:

所以它显然是将连接作为列名。 我不想预加载,因为 - 据我所知 - 这会将整个 table 加载到内存中,并且它会变大,所以我需要在数据库级别进行连接。

I don't want to preload, because - as I understand - this will load the entire table in memory, and it can get big, so I need a join at the database level.

预加载不会将整个 table 加载到内存中,而只会加载特定外键与给定结构的 ID 匹配的记录。

假设 :partnerbelongs_tohas_manyhas_one 关系 User,您可以这样加载它:

user = Repo.get_by!(User, login: auth.info.email) |> Repo.preload(:partner)

如果你依赖 Repo.get_by 到 return 一个 nil 没有找到记录,你需要自己处理这种情况,因为 Repo.preload 会提高如果将 nil 作为第一个参数传递,则会出错:

user = if u = Repo.get_by(User, login: auth.info.email), do: Repo.preload(u, :partner), else: nil

在这些之后,您可以访问 partner 作为 user.partner