Itération 3
La traçabilité
Il est possible, mais nettement plus compliqué, de garder trace de l’origine de la connexion, au niveau de la source et du bloc. Le niveau bloc ne paraît pas indispensable.
Communication::Website::Connections
# id :uuid not null, primary key
# university_id :uuid not null, indexed
# website_id :uuid not null, indexed
# object_type :string indexed => [object_id]
# object_id :uuid indexed => [object_type]
# block_id :uuid indexed
# source_type :string indexed => [source_id]
# source_id :uuid indexed => [source_type]
# created_at :datetime not null
# updated_at :datetime not null
On note comme source l’entité qui est à l’origine de la connexion. Dans beaucoup de scénarios, c’est une chaîne :
- un site est lié à une école
- une école a des formations
- une formation a des enseignants
- un enseignant a une photo
Pour matérialiser cela, il faut probablement créer une connexion pour chaque niveau, dans le cas précédent, pour la photo (qui est un blob) :
- object: photo, source: école
- object: photo, source: formation
- object: photo, source: enseignant
Si l’école est déconnectée du site, le lien avec les formations va disparaître, donc celui avec les enseignants, donc celui avec la photo. Ce calcul se fait en nettoyage nocturne pour permettre de reconstruire par le bas, depuis le site Web, ce qui est plus long mais plus fiable.### Le contexte On inscrit la connexion dans l’université et dans le site Web.
L’objet
On mentionne l’objet polymorphe (page, personne, blob…).
Un objet peut être listé plusieurs fois, une fois par connexion.
Par exemple, si une personne peut être ajoutée directement au site et ajoutée à un bloc dans une page.
La première connexion aura block
nil
et le website comme source
.
La seconde aura une référence au block, et la page comme source
.
Le bloc
Le bloc est un lien optionnel, si l’objet est lié dans le cadre d’un bloc. Les blocs ne doivent pas être considérés comme des dépendances, parce qu’ils n’existent jamais seuls, ils ont toujours un objet parent (page, actu, personne…). En revanche, il peut être utile de savoir par quel bloc un objet est connecté à sa source.
La source
La source est l’entité dont l’objet est la dépendance :
- l’image d’une page a pour source la page
- l’image d’une personne a pour source la personne
- la personne mentionnée dans un bloc a pour source l’objet auquel est rattaché le bloc (la page, par exemple)
Cas
- L’organisation Noesya est connectée au site
- En cascade, Pierre-André, appartenant à Noesya, est connecté au site
- En cascade, par un bloc Organisations de Pierre-André, l’organisation Semiodesign est connectée au site
Sans avoir la source :
- Si je déconnecte Noesya, Pierre-André reste connecté.
- A la repasse des connexions, Pierre-André reconnecte Noesya par ses dépendances.
Avec la source :
- Si je déconnecte Noesya, je déconnecte Pierre-André en cascade.
- En déconnectant Pierre-André, je déconnecte Semiodesign en cascade.
- A la repasse des connexions, ni Pierre-André, ni ses organisations ne se reconnectent (plus de lien).
Avec 2 sources pour Pierre-André (une organisation Noesya et une actualité “Bonnes vacances”) :
Si je déconnecte Noesya, je déconnecte Pierre-André en cascade (par la source Noesya).
Je garde la connexion de Pierre-André ayant pour source l’actualité “Bonnes vacances”.
Pierre-André référence 2 organization via des blocks orgas (Noesya & SemioDesign)
Je connecte mon actualité “Bonnes vacances” dont Pierre-André est l’auteur
- ça crée une connexion à Pierre-André source l’actu Bonnes Vacances
- ça crée une connextion à Noesya source l’actu Bonnes Vacances
- ça crée une connexion à SemioDesign source l’actu Bonnes Vacances
Je connecte mon actualité “Le grand retour” dont Pierre-André est l’auteur
- ça crée une connexion à Pierre-André source l’actu Le grand retour
- ça crée une connextion à Noesya source l’actu Le grand retour
- ça crée une connexion à SemioDesign source l’actu Le grand retour
Je dépublie l’actu “bonnes vacances”
ça détruit toutes les connexions source l’actu Bonnes vacances
Pierre-André reste connecté via l’actu “Le grand retour”
Idem Noesya et SemioDesign
L’algorithme
concerns/WithDependencies
def connect_dependencies(website, source: nil, block: nil)
dependencies.each do |dependency|
connect_dependency(dependency, website, source: source, block: block)
end
end
def connect_dependency(dependency, website, source: nil, block: nil)
if website.is_connected?(dependency)
website.touch_connection dependency
else
if dependency.is_a? Communication::Block
source = dependency.about
block = dependency
end
website.connect dependency, source: source, block: block
dependency.connect_dependencies website, source: source, block: dependency
end
end
Communication::Website
has_many :connections
has_many :objects,
-> { distinct },
through: :connections
def is_connected?(object, source: nil, block: nil)
connection(object, source, block).any?
end
def connect(object, source: nil, block: nil)
connection(object, source, block).first_or_create
end
def touch_connection(object, source: nil, block: nil)
connection(object, source, block).touch_all
end
def disconnect(object, source: nil, block: nil)
connection(object, source, block).destroy_all
end
protected
def connection(object, source: nil, block: nil)
connections.where university: university,
object: object,
source: source,
block: block
end