2016-04-28 42 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 

第一個參數是主表和第二將是第一個加入。