基于Ecto关联查询

Nan*_*usa 6 elixir ecto phoenix-framework

在Rails Controller中,您经常会看到下面的代码,以便只获取属于current_user的帖子;

class PostsController < APIController
  def show
    current_user.posts.find(params[:id])
  end
end
Run Code Online (Sandbox Code Playgroud)

使用Ecto表达这一点的最佳方式是什么?

Gaz*_*ler 8

您可以使用Ecto.Model.assoc/2以及Repo函数.

要获得单个项目:

assoc(current_user, :posts) |> Repo.get(id)
Run Code Online (Sandbox Code Playgroud)

获取用户的所有帖子:

assoc(current_user, :posts) |> Repo.all()
Run Code Online (Sandbox Code Playgroud)

您还可以使用它来撰写查询:

例如

defmodule Post do
  use Ecto.Model

  ...

  def published(query) do
    from p in query,
      where: p.published
  end
end

assoc(current_user, :posts) |> Post.published() |> Repo.all()
Run Code Online (Sandbox Code Playgroud)