我如何加入长生不老药中的 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 匹配的记录。
假设 :partner
是 belongs_to
或 has_many
或 has_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
。
我需要查找一个用户,但还要与另一个 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 匹配的记录。
假设 :partner
是 belongs_to
或 has_many
或 has_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
。