Come far sì che un tag produca una relazione

0

Sto lavorando su un progetto usando Python Flask-SQLAlchemy con un modello come questo:

l'auto ha componenti, i componenti possono avere errori

car ha una proprietà hybrid_property 'broken' che è vera quando uno dei suoi componenti ha errori.

I tag possono essere aggiunti e assegnati in una tabella (car_id, error_id, tag_id)

uno dei tag sarà qualcosa come "irrilevante"

se tutti gli errori dei componenti di un'auto sono contrassegnati come non pertinenti, dovrebbe essere falso.

C'è un modo per ottenere ciò senza averlo codificato a fondo nella proprietà ibrida?

    
posta tzimme 04.08.2017 - 14:03
fonte

1 risposta

1

Certo che c'è. Ma tu certamente non vuoi farlo; sarei un disastro orribile e non gestibile.

Il tuo modello di dominio mi sembra soddisfacente; anche la codifica hard-code nella proprietà ibrida mi sembra perfetta. Sarebbe qualcosa di simile (pseudo-java, non so python, mi dispiace):

// in Car

public boolean isBroken() {
    return this.components.stream()
       .flatMap(Component::getErrors)
       .anyMatch(Error::isRelevant);
}

// in Error

public boolean isRelevant() {
    return !this.hasTag(ErrorTags.IRRELEVANT);
}

EDIT: Dopo averci pensato per un po 'mi è venuto in mente qualcos'altro:

La domanda è in realtà se l'errore è pertinente al Componente o alla Car . Se l'errore è irrilevante per componente e auto, sarebbe meglio includere tale logica nel componente:

// in Component
public boolean isBroken() {
    return this.errors.stream().anyMatch(Error::isRelevantForComponent);
}

Se l'errore è rilevante per il componente ma non per l'auto, quella logica dovrebbe essere nella classe dell'auto.
Se decidi effettivamente di entrare in quel livello di dettaglio, il tag irrelevant dovrebbe avere un altro attributo context che descrive in quale contesto l'errore è rilevante. È quindi possibile impostare tale proprietà su "CAR" o su "COMPONENT" descrivendo che l'errore è irrilevante o rilevante per l'auto, rispettivamente.

    
risposta data 04.08.2017 - 14:10
fonte

Leggi altre domande sui tag