Class: Identifier::Global

Inherits:
Identifier show all
Includes:
SoftValidation
Defined in:
app/models/identifier/global.rb

Overview

The identifier that is globally unique.

Curators of a specific project assert one canonical global identifier per type for each object, this identifier is identified by having .relation.nil?. If the curators feel there are multiple global identifiers for a given instance they must provide an explicit relationship between the canonical identifier and the alternate identifiers.

Direct Known Subclasses

Doi, GenBankAccessionCode, Isbn, Issn, Lccn, Lsid, MorphbankSpecimenNumber, OccurrenceId, Orcid, Uri, Uuid

Defined Under Namespace

Classes: Doi, GenBankAccessionCode, Isbn, Issn, Lccn, Lsid, MorphbankSpecimenNumber, OccurrenceId, Orcid, Uri, Uuid

Constant Summary

Constant Summary

Constants included from SoftValidation

SoftValidation::ANCESTORS_WITH_SOFT_VALIDATIONS

Instance Attribute Summary (collapse)

Attributes inherited from Identifier

#cached, #identifier, #identifier_object_id, #namespace_id, #project_id, #type

Instance Method Summary (collapse)

Methods included from SoftValidation

#clear_soft_validations, #fix_soft_validations, #soft_fixed?, #soft_valid?, #soft_validate, #soft_validated?, #soft_validations

Methods inherited from Identifier

find_for_autocomplete, prototype_identifier, #type_name

Methods included from Housekeeping

#has_polymorphic_relationship?

Methods included from ActiverecordUtilities

#trim_attributes

Instance Attribute Details

- (String) relation

Defines the relationship between the curator asserted canonical identifier and other identifiers of the same type. Must be provided for every global identifier of the same type beyond the first. Relations are drawn from skos (www.w3.org/TR/skos-reference/#mapping)

Returns:

  • (String)


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
# File 'app/models/identifier/global.rb', line 14

class Identifier::Global < Identifier

  include SoftValidation

  validates :namespace_id, absence: true
  validates :relation, inclusion: {in: ::SKOS_RELATIONS.keys}, allow_nil: true
  validate :permit_only_one_global_without_relation_supplied_per_type

  # Identifier can only be used once, i.e. mapped to a single TW concept
  validates_uniqueness_of :identifier, scope: [:project_id]

  soft_validate(:sv_resolves?, set: :resolved)

  protected

  def set_cached
    update_column(:cached, identifier)
  end

  def permit_only_one_global_without_relation_supplied_per_type
    if identifier_object && identifier_object.identifiers.where(type: type.to_s).where.not(id: id).any?
      errors.add(:relation,
                 " an existing identifier of type #{type} exists, a relation for this identifier must be provided"
      ) if self.relation.nil?
    end
  end

  def sv_resolves?
    responded = false
    unless identifier.nil?
      responded = Utilities::Net.resolves?(identifier)
    end
    soft_validations.add(:identifier, "Identifier '#{identifier}' does not resolve.") unless responded
    responded
  end

end

Instance Method Details

- (Object) permit_only_one_global_without_relation_supplied_per_type (protected)



33
34
35
36
37
38
39
# File 'app/models/identifier/global.rb', line 33

def permit_only_one_global_without_relation_supplied_per_type
  if identifier_object && identifier_object.identifiers.where(type: type.to_s).where.not(id: id).any?
    errors.add(:relation,
               " an existing identifier of type #{type} exists, a relation for this identifier must be provided"
    ) if self.relation.nil?
  end
end

- (Object) set_cached (protected)



29
30
31
# File 'app/models/identifier/global.rb', line 29

def set_cached
  update_column(:cached, identifier)
end

- (Boolean) sv_resolves? (protected)

Returns:

  • (Boolean)


41
42
43
44
45
46
47
48
# File 'app/models/identifier/global.rb', line 41

def sv_resolves?
  responded = false
  unless identifier.nil?
    responded = Utilities::Net.resolves?(identifier)
  end
  soft_validations.add(:identifier, "Identifier '#{identifier}' does not resolve.") unless responded
  responded
end