Class: Subject
  
  
  
  
    - Inherits:
 
    - 
      Sequel::Model
      
        
          - Object
 
          
            - Sequel::Model
 
          
            - Subject
 
          
        
        show all
      
       
    
  
  
    
  
    
      - Includes:
 
      - ASModel, AutoGenerator, ExternalDocuments, ExternalIDs, ImpliedPublication, Publishable, Relationships
 
      
    
  
  
  
    - Defined in:
 
    - backend/app/model/subject.rb
 
  
  Instance Attribute Summary
  
  
  #cached_relationships
  
    
      Class Method Summary
      (collapse)
    
    
  
    
      Instance Method Summary
      (collapse)
    
    
  
  
  
  
  
  
  
  
  
  
  db_value_for, included
  
  
  
  
  
  
  
  
  
  included, #is_published_by_implication?, relevant_relationships
  
  
  
  
  
  
  
  
  
  #assimilate, #cache_relationships, included, #my_relationships, #related_records, #transfer_to_repository, #trigger_reindex_of_dependants
  
  
  
  
  
  
  
  
  
  included
  
  
  
  
  
  
  
  
  
  included
  
  
  
  
  
  
  
  
  
  included
  
  
  
  
  
  
  
  
  Methods included from ASModel
  all_models, included, update_publish_flag, update_suppressed_flag
  
  
  
  
  
  
  
  
  Methods included from JSONModel
  JSONModel, #JSONModel, add_error_handler, all, allow_unmapped_enum_value, backend_url, client_mode?, custom_validations, destroy_model, enum_default_value, enum_values, handle_error, init, load_schema, #models, models, parse_jsonmodel_ref, parse_reference, repository, repository_for, schema_src, set_repository, strict_mode, strict_mode?, with_repository
  
  
    Class Method Details
    
      
  
  
    + (Object) create_from_json(json, opts = {}) 
  
  
  
  
    
      
63
64
65
66 
     | 
    
      # File 'backend/app/model/subject.rb', line 63
def self.create_from_json(json, opts = {})
  set_vocabulary(json, opts)
  super(json, opts.merge(:terms_sha1 => generate_terms_sha1(json)))
end
     | 
  
 
    
      
  
  
    + (Object) ensure_exists(json, referrer) 
  
  
  
  
    
      
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 
     | 
    
      # File 'backend/app/model/subject.rb', line 69
def self.ensure_exists(json, referrer)
  DB.attempt {
    self.create_from_json(json)
  }.and_if_constraint_fails {|exception|
    subject = find_matching(json)
    if !subject
      
      
      
      Log.info("Subject '#{json.terms}' seems to have been created by a currently running transaction.  Restarting this one.")
      sleep 5
      raise RetryTransaction.new
    end
    subject
  }
end
     | 
  
 
    
      
  
  
    + (Object) find_matching(json) 
  
  
  
  
    
      
89
90
91
92
93
94
95 
     | 
    
      # File 'backend/app/model/subject.rb', line 89
def self.find_matching(json)
  source_id = BackendEnumSource.id_for_value("subject_source", json.source)
  Subject.find(:vocab_id => JSONModel(:vocabulary).id_for(json.vocabulary),
               :terms_sha1 => generate_terms_sha1(json),
               :source_id => source_id)
end
     | 
  
 
    
      
  
  
    + (Object) generate_terms_sha1(json) 
  
  
  
  
    
      
56
57
58
59
60 
     | 
    
      # File 'backend/app/model/subject.rb', line 56
def self.generate_terms_sha1(json)
  return nil if json.terms.empty?
  Digest::SHA1.hexdigest(json.terms.map {|term| [term['term'], term['term_type']]}.inspect)
end
     | 
  
 
    
      
  
  
    + (Object) handle_delete(ids_to_delete) 
  
  
  
  
    
      
116
117
118
119
120 
     | 
    
      # File 'backend/app/model/subject.rb', line 116
def self.handle_delete(ids_to_delete)
  self.db[:subject_term].filter(:subject_id => ids_to_delete).delete
  super
end
 
     | 
  
 
    
      
  
  
    + (Object) sequel_to_jsonmodel(objs, opts = {}) 
  
  
  
  
    
      
105
106
107
108
109
110
111
112
113 
     | 
    
      # File 'backend/app/model/subject.rb', line 105
def self.sequel_to_jsonmodel(objs, opts = {})
  jsons = super
  jsons.zip(objs).each do |json, obj|
    json.vocabulary = uri_for(:vocabulary, obj.vocab_id)
  end
  jsons
end
     | 
  
 
    
      
  
  
    + (Object) set_vocabulary(json, opts) 
  
  
  
  
    
      
47
48
49
50
51
52
53 
     | 
    
      # File 'backend/app/model/subject.rb', line 47
def self.set_vocabulary(json, opts)
  opts["vocab_id"] = nil
  if json.vocabulary
    opts["vocab_id"] = parse_reference(json.vocabulary, opts)[:id]
  end
end
     | 
  
 
    
   
  
    Instance Method Details
    
      
  
  
    - (Object) update_from_json(json, opts = {}, apply_nested_records = true) 
  
  
  
  
    
      
98
99
100
101
102 
     | 
    
      # File 'backend/app/model/subject.rb', line 98
def update_from_json(json, opts = {}, apply_nested_records = true)
  self.class.set_vocabulary(json, opts)
  self[:terms_sha1] = self.class.generate_terms_sha1(json) 
  super
end
     | 
  
 
    
      
  
  
    - (Object) validate 
  
  
  
  
    
      
123
124
125
126
127
128
129
130
131
132
133
134
135
136 
     | 
    
      # File 'backend/app/model/subject.rb', line 123
def validate
  super
  if self[:source_id]
    validates_unique([:vocab_id, :source_id, :terms_sha1], :message => "Subject must be unique")
  else
    validates_unique([:vocab_id, :terms_sha1], :message => "Subject must be unique")
  end
  validates_unique([:vocab_id, :source_id, :authority_id], :message => "Subject heading identifier must be unique within source")
  map_validation_to_json_property([:vocab_id, :source_id, :authority_id], :authority_id)
  map_validation_to_json_property([:vocab_id, :terms_sha1], :terms)
  map_validation_to_json_property([:vocab_id, :source_id, :terms_sha1], :terms)
end
     |