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

时间:2016-01-03 20:49:50

标签: elixir phoenix-framework ecto

我有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 个答案:

答案 0 :(得分:6)

Ecto上的

This issue可能与您相关。

目前您有两种选择:

使用Enum.mapjoin

获取后使用select
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)