我该如何加入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: 

所以它显然将连接作为列名称。 我不想预加载,因为 - 据我所知 - 这将加载整个表在内存中,它可以变大,所以我需要在数据库级别的连接。

+0

'preload'只会加载与选定用户相关的记录,而不是整个表格。 – Dogbert

+0

你能举一个例子说明在这种情况下如何使用?我会将您的答案标记为已接受。 – raarts

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

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

假设:partner要么的User一个belongs_tohas_manyhas_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