Как написать экто-код с вложенным отношением - PullRequest
1 голос
/ 21 января 2020

У меня есть следующее отношение таблицы БД.

Prefecture 1 - 1 Member 1 - N MemberAction

Я хотел бы получить данные, в случае SQL .

    SELECT A.action, M.member_name, 
      FROM MemberAction A
      JOIN Member M 
        ON M.id = A.member_id
      JOIN Prefecture P
        ON M.prefecture_id = P.id

Однако я не знаю, как написать код Ecto. Следующий код не работает. Из-за MemberAction does not have association

    query = from a in MemberAction,
            where: a.id == ^action_id,
            preload: [:member, :prefecture]
    Repo.all(query)

Пожалуйста, дайте мне несколько советов.

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Как вы определили свои схемы? Убедитесь, что они похожи на следующее:

defmodule YourApp.Schema.Prefecture do
  use Ecto.Schema
  schema "prefectures" do
    # your fields

    has_one(:member)
  end
end

defmodule YourApp.Schema.Member do
  use Ecto.Schema
  schema "members" do
    # your fields

    belongs_to(:prefecture)
    has_many(:member_actions)
  end
end

defmodule YourApp.Schema.MemberAction do
  use Ecto.Schema
  schema "member_actions" do
    # your fields

    belongs_to(:member)
  end
end

И тогда вы сможете использовать запрос, очень похожий на ваш

    query = from a in MemberAction,
            where: a.id == ^action_id,
            preload: [member: :prefecture]
    Repo.all(query)
1 голос
/ 21 января 2020

Использование Ecto.Query.join/5.

query = from a in MemberAction,
  join: m in Member,
  on: [id: a.member_id]
  join: p in Prefecture,
  on: [id: m.prefecture_id],
  select: {a.action, m.member_name}
...