2016-04-28 39 views
2

我有三种型号User,Group,UserMembership。其中如何撰写加入的ecto查询

关系

defmodule Samajika.Group do 
    has_many :user_memberships, MyApp.UserMembership 
    has_many :users, through: [:user_memberships, :user] 
end 

UserMembership模型具有type列存储的会员类型。例如,它可能会存储owner,tenant等。

现在我想查询Group并获取其成员只有租户。

Ecto.assoc(group, :users) |> Repo.all 

上面给我所有的用户。查询看起来是这样的

#Ecto.Query<from u0 in Samajika.User, join: u1 in Samajika.UserMembership, 
on: u1.group_id in ^[1], where: u0.id == u1.user_id, distinct: true> 

我想用外生查询组成与typeuser_memberships表中添加where子句。

我在组

def tenant(query) do 
    from c in query, where: c.type == "tenant" 
end 

加入这个代码,我做这个

Ecto.assoc(group, :users) |> Group.tenant 

然而,这增加了where条款上users表,而不是连接表user_memberships

什么我应该在我的tenant函数中修改以在连接表上添加条件吗?

回答

8

传递一个列表infrom电话:

def tenant(query) do 
    from [_u, c] in query, where: c.type == "tenant" 
end 

第一个参数是主表和第二将是第一个加入。