在many_to_many关系上过滤预加载

时间:2018-03-06 14:35:27

标签: elixir phoenix-framework ecto

我有两个模型:UserGroupUser,关系为many_to_many

在我的UserGroup索引操作中,我执行以下操作:

user_groups =
  UserGroup
  |> Repo.all
  |> Repo.preload(:users)

而且,在视图中,在渲染用户组时,我会这样做:

def render("index.json", %{user_groups: user_groups}) do
  %{
    user_groups:
      Enum.map(user_groups, fn user_group ->
        %{
          id: user_group.id,
          name: user_group.name,
          users: user_group.users
        }
      end)
  }
end

更改!现在,用户已拥有状态,我只想显示active个用户。

我怎样才能"范围"用户的预加载只显示那些active状态的用户?

1 个答案:

答案 0 :(得分:1)

您可以使用所需的Repo.preload子句将部分查询传递给where。假设"活跃"用户有user.status == "active",您可以这样做:

user_groups =
  UserGroup
  |> Repo.all
  |> Repo.preload(users: from(u in User, where: u.status == "active"))

您可以在documentation

中详细了解相关信息