我需要查找用户,还要将其与另一个表(合作伙伴)联系起来。这是没有连接的工作代码:
result = Repo.get_by(User, login: auth.info.email)
用户表有一个带有伙伴表的外键,所以我想试试这个:
result = Repo.get_by(User, %{ login: auth.info.email, join: :partner } )
但结果是:
field `User.join` in `where` does not exist in the schema in query:
所以它显然将联接作为列名。 我不想预加载,因为 - 据我所知 - 这会将整个表加载到内存中,并且它可能会变大,所以我需要在数据库级别加入。
答案 0 :(得分:2)
我不想预加载,因为 - 据我所知 - 这会将整个表加载到内存中,并且可能会变大,所以我需要在数据库级别加入。
预加载不会将整个表加载到内存中,而只加载特定外键与给定结构的id匹配的记录。
假设:partner
与belongs_to
的关联为has_many
或has_one
或User
,您可以像这样加载:
user = Repo.get_by!(User, login: auth.info.email) |> Repo.preload(:partner)
如果您依靠Repo.get_by
在找不到记录时返回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
。