我正在尝试创建可组合的ecto查询,以列出特定Document
的所有Contributor
。我希望api看起来像这样:
Document
|> Document.for_contributor(contributor)
|> Repo.all()
但是我对从哪里开始感到迷茫。在has_many
关系中,Contributor
可能有很多Document
之前和之前,我一直在进行可组合查询,我会这样做:
def for_contributor(query, %Contributor{} = contributor) do
from(document in query, where: document.contributor_id == ^contributor.id)
end
但是我不确定如何进行类似但具有many_to_many
关系的事情。
我的for_contributor
函数会发生什么?
defmodule MyApp.Document do
use Ecto.Schema
import Ecto.Changeset
alias MyApp.Contributor
schema "documents" do
many_to_many(:contributors, Contributor, join_through: "contributors_documents")
timestamps()
end
def for_contributor(query, %Contributor{} = contributor) do
# ???
end
end
我的联接表如下:
defmodule MyApp.Repo.Migrations.CreateContributorsDocuments do
use Ecto.Migration
def change do
create table(:contributors_documents, primary_key: false) do
add :contributor_id, references(:contributors)
add :document_id, references(:documents)
end
end
end
答案 0 :(得分:1)
我的头脑变得比原来复杂得多。我用一个简单的join
解决了这个问题。
def for_contributor(query, %Contributor{} = contributor) do
from(
document in query,
join: c in assoc(document, :contributors),
where: c.id == ^contributor.id
)
end