如何使用join编写ecto查询

时间:2016-04-28 21:41:42

标签: elixir ecto

我有三个模型UserGroupUserMembership

他们之间的关系是

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

UserMembership模型有一个type列,用于存储成员资格的类型。例如,它可能存储ownertenant等。

现在我想查询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>

我想使用Ecto查询组合在type表上添加user_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函数中修改什么才能在连接表上添加条件?

1 个答案:

答案 0 :(得分:8)

将列表发送到in来电中的from

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

第一个参数是主表,第二个参数是第一个参数。