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.
Jméno sloupce s id záznamu, ke kterému se daná část stromu vztahuje
| acts_as_dag_options[:polymorphic] | ||
| end | ||
|
|
||
| def scoped_record_id |
There was a problem hiding this comment.
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.
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.
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.
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.
| # Does an endpoint match another endpoint or model instance | ||
| def matches?(other) | ||
| self.id == other.id | ||
| id == other.id && scoped_record_id == other.scoped_record_id |
There was a problem hiding this comment.
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.
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.
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.
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.
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.0TODO: přidat testy.