Module: PatientValidations

Included in:
Patient
Defined in:
app/models/patient_validations.rb

Overview

Simply extracted some code to clean up model. I’d like to do this to all of the really big classes but let’s see how this goes first.

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'app/models/patient_validations.rb', line 7

def self.included(base)
# Must delay the calls to these ActiveRecord methods
# or it will raise many "undefined method"s.
base.class_eval do

  validates_presence_of :admit_date
  validate :presence_of_organization_id
  validates_presence_of :diagnosis_id
  validate :presence_of_hospital_no
  validates_length_of   :hospital_no, :maximum => 25, :allow_blank => true
  validates_uniqueness_of :hospital_no, :scope => :organization_id
  validates_past_date_for :admit_date
  validates_past_date_for :diagnosis_date
  validates_past_date_for :treatment_began_on
  validate :admit_date_is_after_dob
  validate :diagnosis_date_is_after_dob
  validate :treatment_began_on_is_after_diagnosis_date
  validate :subject_is_case
  validates_complete_date_for :admit_date,         :allow_nil => true
  validates_complete_date_for :diagnosis_date,     :allow_nil => true
  validates_complete_date_for :treatment_began_on, :allow_nil => true

  validates_length_of :raf_zip, :maximum => 10, :allow_blank => true

  validates_format_of :raf_zip,
    :with => /\A\s*\d{5}(-)?(\d{4})?\s*\z/,
    :message => "should be 12345 or 12345-1234",
    :allow_blank => true

  validates_presence_of :other_diagnosis, :if => :diagnosis_is_other?


  validates_inclusion_of :was_under_15_at_dx, :was_previously_treated,
    :was_ca_resident_at_diagnosis,
      :in => YNDK.valid_values, :allow_nil => true


protected

  ##
  #  This validation does not work when using nested attributes as 
  #  the study_subject has not been resolved yet, unless this is an update.
  #  This results in a similar validation in Subject.
  def admit_date_is_after_dob
    if !admit_date.blank? && 
      !study_subject.blank? && 
      !study_subject.dob.blank? && 
      study_subject.dob.to_date != Date.parse('1/1/1900') &&
      admit_date < study_subject.dob &&
      admit_date.to_date != Date.parse('1/1/1900')
      errors.add(:admit_date, "is before study_subject's dob.") 
    end
  end

  ##
  #  This validation does not work when using nested attributes as 
  #  the study_subject has not been resolved yet, unless this is an update.
  #  This results in a similar validation in Subject.
  def diagnosis_date_is_after_dob
    if !diagnosis_date.blank? && 
      !study_subject.blank? && 
      !study_subject.dob.blank? && 
      diagnosis_date < study_subject.dob
      errors.add(:diagnosis_date, "is before study_subject's dob.") 
    end
  end

  ##
  #  Both are patient dates so this doesn't need in subject!
  #  custom validation and custom message
  def treatment_began_on_is_after_diagnosis_date
    if !treatment_began_on.blank? && 
      !diagnosis_date.blank? && 
      treatment_began_on < diagnosis_date
#     errors.add(:treatment_began_on, "is before diagnosis_date.") 
      errors.add(:treatment_began_on, ActiveRecord::Error.new(
        self, :base, :blank, { 
          :message => "Date treatment began must be on or after the diagnosis date." } ) )
    end
  end

  ##
  #  This validation does not work when using nested attributes as 
  #  the study_subject has not been resolved yet, unless this is an update.
  #  This results in a similar validation in Subject.
  def subject_is_case
    if study_subject and !study_subject.is_case?
      errors.add(:study_subject,"must be case to have patient info")
    end
  end

  #  custom validation for custom message without standard attribute prefix
  def presence_of_organization_id
    if organization_id.blank?
      errors.add(:organization_id, ActiveRecord::Error.new(
        self, :base, :blank, { 
          :message => "Treating institution can't be blank." } ) )
    end
  end

  #  custom validation for custom message without standard attribute prefix
  def presence_of_hospital_no
    if hospital_no.blank?
      errors.add(:hospital_no, ActiveRecord::Error.new(
        self, :base, :blank, { 
          :message => "Hospital record number can't be blank." } ) )
    end
  end

end # class_eval
end