如何使用join编写ecto查询

sha*_*evy 3 elixir ecto

我有三个型号User,Group,UserMembership.

他们之间的关系是

defmodule Samajika.Group do
  has_many :user_memberships, MyApp.UserMembership
  has_many :users, through: [:user_memberships, :user]
end
Run Code Online (Sandbox Code Playgroud)

UserMembershipmodel有一个type存储成员资格类型的列.对于例如,它可以存储owner,tenant等等.

现在我想查询Group并获得只有租户的成员.

Ecto.assoc(group, :users) |> Repo.all
Run Code Online (Sandbox Code Playgroud)

以上给了我所有用户.查询看起来像这样

#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>
Run Code Online (Sandbox Code Playgroud)

我想使用Ecto查询组合typeuser_memberships表上添加where子句.

我在我的小组中添加了此代码

def tenant(query) do
    from c in query, where: c.type == "tenant"
end
Run Code Online (Sandbox Code Playgroud)

我这样做

Ecto.assoc(group, :users) |> Group.tenant
Run Code Online (Sandbox Code Playgroud)

但是这会whereusers表上添加子句,而不是连接表user_memberships

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

Dog*_*ert 11

infrom呼叫中传递一个列表:

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

第一个参数是主表,第二个参数是第一个连接.