我如何加入elixir中的Repo.find_by()

时间:2016-12-26 14:57:30

标签: elixir ecto

我需要查找用户,还要将其与另一个表(合作伙伴)联系起来。这是没有连接的工作代码:

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:

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

1 个答案:

答案 0 :(得分:2)

  

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

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

假设:partnerbelongs_to的关联为has_manyhas_oneUser,您可以像这样加载:

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