-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(WIP) Add scoped record id column #30
base: main
Are you sure you want to change the base?
Conversation
def direct_column_name | ||
acts_as_dag_options[:direct_column] | ||
end | ||
def scoped_record_id_column_name |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Jméno sloupce s id záznamu, ke kterému se daná část stromu vztahuje
end | ||
|
||
def scoped_record_id |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
id
sloupce scoped_record_id_column_name
. Pokud není definován, vrací se nil
. Jde pořád o volitelný parametr a vše musí fungovat i bez něj.
uniqueness_scope = [ancestor_type_column_name, descendant_type_column_name, descendant_id_column_name] | ||
uniqueness_scope << scoped_record_id_column_name.to_sym if scoped_record_id_column_name.present? | ||
validates ancestor_id_column_name.to_sym, uniqueness: { scope: uniqueness_scope } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pro validaci je nutné přidat sloupec scoped_record_id_column_name
, jinak by nešel vytvořit jiný strom se stejným záznamem.
uniqueness_scope << scoped_record_id_column_name.to_sym if scoped_record_id_column_name.present? | ||
validates ancestor_id_column_name.to_sym, uniqueness: { scope: uniqueness_scope } | ||
|
||
scope :with_ancestor, lambda { |ancestor, scoped_record_id = nil| |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Všechny scope
musí mít možnost zaměřit konkrétní strom pomocí scoped_record_id
uniqueness_scope = [descendant_id_column_name] | ||
uniqueness_scope << scoped_record_id_column_name.to_sym if scoped_record_id_column_name.present? | ||
validates ancestor_id_column_name.to_sym, uniqueness: { scope: uniqueness_scope } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pro validaci je nutné přidat sloupec scoped_record_id_column_name
, jinak by nešel vytvořit jiný strom se stejným záznamem.
def matches?(other) | ||
self.id == other.id | ||
id == other.id && scoped_record_id == other.scoped_record_id |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pro porovnání je třeba přidat scoped_record_id
def self.from_resource(resource) | ||
self.new(resource.id) | ||
# Factory Construction method that creates an endpoint from a model | ||
def self.from_resource(resource, scoped_record_id) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
U metod v tomto modelu bylo třeba přidat scoped_record_id
tak, aby ho bylo možné předávat dál.
base.send(:include, EdgeInstanceMethods) | ||
end | ||
|
||
def ancestor_scoped_record_id(ancestor) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Když se vytváří hrana stromu, doplňují se i nepřímé hrany. Během toho nesmím zapomenout předávat hodnotu scoped_record_id
, aby hrany spadaly do jednoho stromu.
Podmínky níže by možná měly být opačně a možná by stačila jen
ancestor.public_send(scoped_record_id_column_name) if scoped_record_id_column_name
To ještě prozkoumám.
sink = self::EndPoint.from(descendant) | ||
conditions = self.conditions_for(source, sink) | ||
path = self.new(conditions) | ||
scoped_record_id = ancestor_scoped_record_id(ancestor) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Původně jsem chtěl volat def build_edge(ancestor, descendant, scoped_record_id)
, ale jak se to pořád zanořuje dál, tak bylo jednodušší brát to id z ancestor
.
def self.from_resource(resource) | ||
self.new(resource.id, resource.class.to_s) | ||
# Factory Construction method that creates an EndPoint instance from a model | ||
def self.from_resource(resource, scoped_record_id) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Narovinu se přiznám, že jsem ty end pointy úplně nepobral. Akorát bylo nutné všude možně přidat scoped_record_id
, aby si ho mohly předávat dál a vytvářeli se hrany s tím id, respektive se podle toho vyhledávalo.
Add scoped record id column
Motivation and context
Přidání možnosti opakování záznamů v tabulce v jiném podstromu díky sloupci
scoped_record_id_column
.Využíváme v demand workflow - vícekrokové poptávce. Pokud chceme mít možnost opakovat nějaké prvky (kroky nebo celé stromy) v rámci různých workflow, musí být dodatečně určeno, kterému konkrétnímu stromu vazba v tabulce patří. Nevýhodou je, že krok jako takový tuto informaci nemá a je třeba zadat mu ji zvenčí. To je realizováno pomocí
attr_accessor
, jehož jméno je definováno v parametruscoped_record_id_column
.Vzhledem k tomu, že jsem na tom pracoval mimo tento gem a sem jsem nahrál rovnou až výsledek, není tu zaznamenána historie commitů. První největší se týkal pouze refactoringu, aby styl odpovídal rubocopu používaném v Nere.
Z tohoto důvodu raději přidám komentáře přímo do kódu, abych objasnil změny. Kde komentáře nejsou, tam jde v podstatě pouze o refactor dle rubocopa.
Změnil jsem verzi na
5.0.0
TODO: přidat testy.