У меня есть таблица с именем :issues
, и мне нужно установить sh способ связать две проблемы. Я думал о создании новой таблицы с именем :links
, но у меня возникли некоторые проблемы при разработке схемы Ecto из-за правил, которым я должен следовать:
1. Links should be two-way and be any of these types: ["blocked-by" | "blocking" | "relates-to"]
2. If Issue-A is blocked-by Issue-B, Issue-B should be blocking Issue-A
3. If Issue-A relates-to Issue-B, Issue-B should relates-to Issue-A
4. Creating a link on one issue should create a link on the linked issue, following rules 1 and 2.
Что еще больше усложняет это существование других таблицы :stories
, :notes
, :milestones
, потому что я должен иметь возможность связать запись из таблицы с записью из другой таблицы или из той же таблицы с теми же правилами, что и выше.
У меня есть Также подумал о создании таблицы для каждого типа ссылки. Например, обновленная схема для Issue
будет выглядеть следующим образом:
defmodule MyApplication.Issue do
use Ecto.Schema
@primary_key false
schema "issues" do
field(:issue_id, Ecto.UUID, primary_key: true)
has_many(:linked_issues, LinkedIssue)
has_many(:linked_stories, LinkedStory)
has_many(:linked_notes, LinkedNote)
has_many(:linked_milestones, LinkedMilestone)
end
end
, и я должен сделать то же самое для Story
, Note
и Milestone
. Я просто запутался в том, как мне настроить свои миграции и ссылки. Я также не уверен, как таблицы объединения будут знать, какая таблица их связывает, и как я могу сделать отношения двусторонними, следуя четвертому правилу, приведенному выше.