Ecto - 根据关联查询 table

Ecto - querying a table based on an association

我有以下表格:

schema "project_users" do
  belongs_to(:user, MyApp.User)
end

schema "users" do
  field(:search_vector, :tsvector)
end

我想在查询users后根据search_vector的结果查询project_users,与belongs_tobelongs_to关系

我对 users 有以下查询。我想知道如何将它与 project_users:

联系起来
def query_all_users(params \ %{}, preload \ []) do
  query = from(u in User, preload: ^preload)

  query_by(query, params)
end

defp query_by(query, %{"keyword" => keyword} = params) do
  query = from(q in query, where: fragment("search_vector @@ plainto_tsquery(?)", ^keyword))

  query_by(query, Map.delete(params, "keyword"))
end

如果我没看错,你需要 has_one/has_many 关系 usersproject_users
更新架构 users:

schema "users" do
  field(:search_vector, :tsvector)

  has_one :project_user, ProjectUser  # <---
end

并使用preload函数:

query |> preload(:project_user)

我建议创建一个执行连接然后过滤的查询:

defmodule ProjectUser do
  use Ecto.Schema

  import Ecto.Query

  schema "project_users" do
    belongs_to :user, User
  end

  @spec by_search_vector(Ecto.Queryable.t, String.t) :: Ecto.Query.t
  by_search_vector(query, search_vector) do
    from pu in query,
      join: u in assoc(pu, :user),
      where: fragment("? @@ plainto_tsquery(?)", u.search_vector, ^search_vector)
  end
end

这应该很容易缩小项目用户的范围。