当前位置:  开发笔记 > 编程语言 > 正文

如何在Ecto Query中创建条件连接?

如何解决《如何在EctoQuery中创建条件连接?》经验,为你挑选了1个好方法。

我有2个模型 - 用户和ApiKey(用户has_many api_keys),我正在尝试创建条件连接.我的意思是我想用他的活跃ApiKeys加载单个查询用户.我目前的代码看起来像

query = from u in User, 
        join: a in assoc(u, :api_keys), 
        where: u.email == ^email,
        preload: [api_keys: a]
user = Repo.one(query)
Repo.preload user, api_keys: (from a in ApiKey, where: a.is_active == true)

但不幸的是,我发现 - 预加载方法无法在数据已预加载时更改api_keys的集合.

你能告诉我一个很好的例子吗 - 如何预加载"活跃的"api_keys?



1> Gazler..:

关于Ecto的这个问题可能与您相关.

目前您有两种选择:

使用Enum.map使用提取后joinselect:

query = from u in User, 
        join: a in assoc(u, :api_keys), 
        where: u.email == ^email,
        where: a.is_active == true,
        select: {u, a}
user = Repo.one(query) |> Enum.map(fn ({u, a}) -> %{u | api_keys: a} end)

使用查询作为Ecto.Query.preload/3的参数:

api_key_query = from a in ApiKey, where: a.is_active == true
query = from u in User, 
        join: a in assoc(u, :api_keys), 
        where: u.email == ^email,
        preload: [api_keys: ^api_key_query]
user = Repo.one(query)


@AlexeyPoimtsev使用预加载时始终执行两个或多个查询.但是,预加载通常比使用连接更好.请阅读http://blog.plataformatec.com.br/2015/08/working-with-ecto-associations-and-embeds/的"查询关联"部分 - "这通常是加载关联的最有效方式数据库(即使执行了两个查询),因为我们只需要接收和解析POSTS + COMMENTS结果."
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有