Class: Descriptor
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Descriptor
- Includes:
- Housekeeping, Shared::AlternateValues, Shared::Citations, Shared::Confidences, Shared::DataAttributes, Shared::Depictions, Shared::Documentation, Shared::Identifiers, Shared::IsData, Shared::Notes, Shared::Tags, SoftValidation
- Defined in:
- app/models/descriptor.rb
Overview
require_dependency Rails.root.to_s + '/app/models/observation.rb' Descriptors are the general mechanism for describing CollectionObjects (individual specimens) or Otus (taxa).
They come in various types, reflecting the approaches commonly used to describe specimens and OTUs:
Working - raw notes or images, "primal" observations, not yet refined to states or measurements Qualitative - Represents character/character_state expressions as traditionally understood. Quantitative - Single measurements. Sample - Summaries of multiple observations recorded in a statistical manner. Only valid for Otus. For example "length 42-77mm (n=5, min: 42, max:Only valid for Otus."
Direct Known Subclasses
Continuous, Gene, Media, PresenceAbsence, Qualitative, Sample, Working
Defined Under Namespace
Classes: Continuous, Gene, Media, PresenceAbsence, Qualitative, Sample, Working
Constant Summary collapse
- ALTERNATE_VALUES_FOR =
[:name, :short_name, :description_name, :key_name].freeze
Constants included from SoftValidation
SoftValidation::ANCESTORS_WITH_SOFT_VALIDATIONS
Class Method Summary collapse
Instance Method Summary collapse
- #gene? ⇒ Boolean
-
#observation_type ⇒ Object
String, nil the corresponding Observation STI class name.
- #presence_absence? ⇒ Boolean
-
#qualitative? ⇒ Boolean
TODO: these should be
is_to follow design pattern. - #short_name_is_shorter ⇒ Object protected
- #sv_short_name_is_short ⇒ Object protected
-
#target_name(target, language_id) ⇒ String
Name of the descriptor in a particular language.
-
#type_is_subclassed ⇒ Object
protected
TODO: get rid of this.
-
#unify_relations ⇒ Object
observation_matrix_column_items carries class_name: so inferred_relations drops it.
Methods included from SoftValidation
#clear_soft_validations, #fix_for, #fix_soft_validations, #soft_fixed?, #soft_valid?, #soft_validate, #soft_validated?, #soft_validations, #soft_validators
Methods included from Shared::IsData
#errors_excepting, #full_error_messages_excepting, #identical, #is_community?, #is_in_use?, #similar
Methods included from Shared::Documentation
#document_array=, #documented?, #reject_documentation, #reject_documents
Methods included from Shared::Confidences
Methods included from Shared::AlternateValues
#all_values_for, #alternate_valued?
Methods included from Shared::DataAttributes
#import_attributes, #internal_attributes, #keyword_value_hash, #reject_data_attributes
Methods included from Shared::Depictions
#has_depictions?, #image_array=, #reject_depictions, #reject_images
Methods included from Shared::Notes
#concatenated_notes_string, #reject_notes
Methods included from Shared::Tags
#reject_tags, #tag_with, #tagged?, #tagged_with?
Methods included from Shared::Identifiers
#dwc_occurrence_id, #identified?, #next_by_identifier, #previous_by_identifier, #reject_identifiers, #uri, #uuid, #visible_identifiers_for
Methods included from Shared::Citations
#cited?, #mark_citations_for_destruction, #nomenclature_date, #origin_citation_source_id, #reject_citations, #requires_citation?, #sources_by_topic_id
Methods included from Housekeeping
#has_polymorphic_relationship?
Methods inherited from ApplicationRecord
Class Method Details
.human_name ⇒ Object
55 56 57 |
# File 'app/models/descriptor.rb', line 55 def self.human_name self.name.demodulize.humanize end |
Instance Method Details
#gene? ⇒ Boolean
104 105 106 |
# File 'app/models/descriptor.rb', line 104 def gene? type == 'Descriptor::Gene' end |
#observation_type ⇒ Object
Returns String, nil the corresponding Observation STI class name.
61 62 63 64 |
# File 'app/models/descriptor.rb', line 61 def observation_type return nil if type.blank? 'Observation::' + type.split('::').last end |
#presence_absence? ⇒ Boolean
100 101 102 |
# File 'app/models/descriptor.rb', line 100 def presence_absence? type == 'Descriptor::PresenceAbsence' end |
#qualitative? ⇒ Boolean
TODO: these should be is_ to follow design pattern
96 97 98 |
# File 'app/models/descriptor.rb', line 96 def qualitative? type == 'Descriptor::Qualitative' end |
#short_name_is_shorter ⇒ Object (protected)
117 118 119 |
# File 'app/models/descriptor.rb', line 117 def short_name_is_shorter errors.add(:short_name, 'is longer than name!') if short_name && name && (short_name.length > name.length) end |
#sv_short_name_is_short ⇒ Object (protected)
121 122 123 |
# File 'app/models/descriptor.rb', line 121 def sv_short_name_is_short soft_validations.add(:short_name, 'should likely be less than 12 characters long') if short_name && short_name.length > 12 end |
#target_name(target, language_id) ⇒ String
Returns name of the descriptor in a particular language.
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 |
# File 'app/models/descriptor.rb', line 68 def target_name(target, language_id) n = self.name a = nil case target when :key n = self.key_name.nil? ? n : self.key_name when :description n = self.description_name.nil? ? n : self.description_name end unless language_id.nil? case target when :key a = AlternateValue::Translation. where(alternate_value_object: self, language_id: language_id). where("(alternate_values.alternate_value_object_attribute = 'key_name' OR alternate_values.alternate_value_object_attribute = 'name')"). order(:alternate_value_object_attribute).pluck(:value).first when :description a = AlternateValue::Translation. where(alternate_value_object: self, language_id: language_id). where("(alternate_values.alternate_value_object_attribute = 'description_name' OR alternate_values.alternate_value_object_attribute = 'name')"). order(:alternate_value_object_attribute).pluck(:value).first end end return a.nil? ? n : a end |
#type_is_subclassed ⇒ Object (protected)
TODO: get rid of this
111 112 113 114 115 |
# File 'app/models/descriptor.rb', line 111 def type_is_subclassed if !DESCRIPTOR_TYPES[type] errors.add(:type, 'type must be a valid subclass') end end |
#unify_relations ⇒ Object
observation_matrix_column_items carries class_name: so inferred_relations drops it. Force it back so column items are moved to the surviving descriptor during unify rather than being destroyed with the removed one.
49 50 51 52 53 |
# File 'app/models/descriptor.rb', line 49 def unify_relations ApplicationEnumeration.klass_reflections(self.class, :has_many).select { |r| r.name == :observation_matrix_column_items } end |