我有三个型号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查询组合type在user_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)
但是这会where在users表上添加子句,而不是连接表user_memberships
我应该在我的tenant函数中修改什么才能在连接表上添加条件?
Dog*_*ert 11
in在from呼叫中传递一个列表:
def tenant(query) do
from [_u, c] in query, where: c.type == "tenant"
end
Run Code Online (Sandbox Code Playgroud)
第一个参数是主表,第二个参数是第一个连接.