我该如何加入elixir中的Repo.find_by()
问题描述:
我需要查找一个用户,并且还要将其与另一个表(伙伴)进行连接。这里是没有工作的代码加入:我该如何加入elixir中的Repo.find_by()
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:
所以它显然将连接作为列名称。 我不想预加载,因为 - 据我所知 - 这将加载整个表在内存中,它可以变大,所以我需要在数据库级别的连接。
答
我不想预加载,因为 - 据我所知 - 这会将整个表加载到内存中,并且它会变大,所以我需要在数据库级别进行连接。
预加载不会在内存中加载整个表,而只会加载特定外键与给定结构ID相匹配的记录。
假设:partner
要么的User
一个belongs_to
或has_many
或has_one
的关系,你可以加载它:
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
。
+0
这是加入的方式应该处理,还是有更好的方法? – raarts
'preload'只会加载与选定用户相关的记录,而不是整个表格。 – Dogbert
你能举一个例子说明在这种情况下如何使用?我会将您的答案标记为已接受。 – raarts