Last active
July 10, 2019 10:50
-
-
Save fathur/ddbeab8d26970eca5492e551696d8034 to your computer and use it in GitHub Desktop.
Risk many to many logic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module ObserverInterface | |
| def update(observable) | |
| raise ImplementationError # Class ZBC not implemented method xyz | |
| end | |
| end | |
| class Risk | |
| include ObserverInterface | |
| include RiskInterface | |
| end | |
| class DiseaseRisk < Risk | |
| def eligible? | |
| @pregnancy.diseases.each do |disease| | |
| if disease.slug == self.disease_slug | |
| return true | |
| end | |
| end | |
| false | |
| end | |
| def update(observable) # DiseaseRiskObservable | |
| if observable.instance_of?(DiseaseRiskObservable) | |
| add_risk if eligible? | |
| end | |
| end | |
| def add_risk | |
| obvservable.clasification.send(:riskable) << Risk.find(slug: slug) | |
| end | |
| end | |
| class AsthmaRisk < DiseaseRisk | |
| self.risk_slug = :asma | |
| self.disease_slug = :asma | |
| self.riskable = :pregnancy | |
| end | |
| class HivRisk < DiseaseRisk | |
| self.riskable = :mother | |
| end | |
| class RiskClasification | |
| def initialize | |
| @mother = Array.new | |
| @pregnancy = Array.new | |
| @anc = Array.new | |
| end | |
| end | |
| class DiseaseRiskObservable | |
| attr_accessor :pregnancy | |
| def initialize | |
| @clasification = RiskClasification.new | |
| end | |
| def observers=(obsrvs) | |
| @observers << obsrvs | |
| end | |
| # def pregnancy=(p) | |
| # @pregnancy = p | |
| # end | |
| # pregnancy_risks = Array.new | |
| # mother_risks = Array.new | |
| def notify | |
| @observers.each do |observer| | |
| observer.update(self) | |
| end | |
| pregnancy_risks = @risk_clasification.pregnancy | |
| mother_risks = @risk_clasification.mother | |
| #pregnancy_risks = generate_risk :pregnancy | |
| #mother_risks = generate_risk :mother | |
| pr_sync = [] | |
| pregnancy_risks.each do |pr| | |
| pr_sync[pr.id] = {child_id: @anc.id} | |
| end | |
| @pregnancy.risks.sync pr_sync#[1: {child_id: @anc.id},2: {child_id: @anc.id},3: {child_id: @anc.id}] | |
| # x = Hash[[risk.id, @pregnancy.id], []] | |
| @mother.risks.sync x | |
| [ | |
| 9: {child_id: @pregancy.id}, | |
| 8: {child_id: @pregancy.id}, | |
| 4: {child_id: @pregancy.id} | |
| ] | |
| end | |
| # def generate_risk(type) | |
| # risks = [] | |
| # @observers.each do |observer| | |
| # observer = observer.to_s.camelize + 'Risk' | |
| # observer = observer.constantize | |
| # risk_observer = observer.new # AsthmaRisk.new | |
| # # if risk_observer.eligible? | |
| # risks << risk_observer.risk if (risk.riskable == type && risk_observer.eligible?) | |
| # # end | |
| # end | |
| # end | |
| end | |
| dro = DiseaseRiskObservable.new | |
| dro.observers = [:asthma, :hiv] | |
| dro.pregnancy = pregnancy | |
| dro.notify | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class TooClose < Risk | |
| self.riskable = :pregnancy | |
| def eligible? | |
| @pregnancy.hpht - @pregnancy.last_maternity_date > 2 | |
| end | |
| end | |
| class PregnancyObservable | |
| def observers=(obsrvs) | |
| @observers << obsrvs | |
| end | |
| def notify | |
| @observers.each do |observer| | |
| observer.update(self) | |
| end | |
| @pregnancy.risks.sync p_risks | |
| end | |
| end | |
| class Pregnancy < ActiveRecord::Base | |
| after_save :calculate_risk | |
| def calcualte_risk | |
| dro = PregnancyObservable.new self | |
| dro.observers = [:abortus, :too_often, :too_close] | |
| # dro.observable = self | |
| dro.notify | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment