Class: BiologicalAssociations::CreateWithAnatomicalParts

Inherits:
Object
  • Object
show all
Defined in:
lib/biological_associations/create_with_anatomical_parts.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params) ⇒ CreateWithAnatomicalParts

Returns a new instance of CreateWithAnatomicalParts.



5
6
7
8
9
10
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 5

def initialize(params)
  # ActionController::Parameters#to_h returns a HashWithIndifferentAccess
  # recursively, so all nested attributes are accessible by symbol key.
  @params = params.to_h
  @biological_association = nil
end

Instance Attribute Details

#biological_associationObject (readonly)

Returns the value of attribute biological_association.



3
4
5
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 3

def biological_association
  @biological_association
end

Instance Method Details

#base_attributesObject (private)

Symbol keys work because @params is a HashWithIndifferentAccess (set in #initialize via to_h).



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 38

def base_attributes
  @params.except(
    :subject_anatomical_part_attributes,
    :object_anatomical_part_attributes,
    :subject_taxon_determination_attributes,
    :object_taxon_determination_attributes,
    :biological_association_subject_id,
    :biological_association_subject_type,
    :biological_association_object_id,
    :biological_association_object_type
  )
end

#build_association_end(id:, type:, anatomical_part_attributes:, taxon_determination_attributes:) ⇒ Object (private)

Raises:

  • (ArgumentError)


69
70
71
72
73
74
75
76
77
78
79
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 69

def build_association_end(id:, type:, anatomical_part_attributes:, taxon_determination_attributes:)
  raise ArgumentError, "#{type.inspect} is not a valid type for biological associations" unless BIOLOGICALLY_RELATABLE_TYPES.include?(type)

  origin = type.constantize.find(id)

  return origin if anatomical_part_attributes.blank?

  create_taxon_determination_if_needed(origin, taxon_determination_attributes)

  create_anatomical_part(origin, anatomical_part_attributes)
end

#build_objectObject (private)



60
61
62
63
64
65
66
67
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 60

def build_object
  build_association_end(
    id: param(:biological_association_object_id),
    type: param(:biological_association_object_type),
    anatomical_part_attributes: param(:object_anatomical_part_attributes),
    taxon_determination_attributes: param(:object_taxon_determination_attributes)
  )
end

#build_subjectObject (private)



51
52
53
54
55
56
57
58
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 51

def build_subject
  build_association_end(
    id: param(:biological_association_subject_id),
    type: param(:biological_association_subject_type),
    anatomical_part_attributes: param(:subject_anatomical_part_attributes),
    taxon_determination_attributes: param(:subject_taxon_determination_attributes)
  )
end

#callObject



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 12

def call
  begin
    ActiveRecord::Base.transaction do
      subject = build_subject
      object = build_object

      @biological_association = BiologicalAssociation.new(base_attributes)

      @biological_association.biological_association_subject = subject
      @biological_association.biological_association_object = object

      @biological_association.save!
    end
  rescue ActiveRecord::RecordInvalid, ArgumentError => e
    if @biological_association.nil?
      @biological_association = BiologicalAssociation.new
      @biological_association.errors.add(:base, e.message)
    end
  end

  @biological_association
end

#create_anatomical_part(origin, anatomical_part_attributes) ⇒ Object (private)



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 94

def create_anatomical_part(origin, anatomical_part_attributes)
  attributes = {
    name: anatomical_part_attributes[:name],
    uri: anatomical_part_attributes[:uri],
    uri_label: anatomical_part_attributes[:uri_label],
    is_material: anatomical_part_attributes[:is_material],
    preparation_type_id: anatomical_part_attributes[:preparation_type_id]
  }

  attributes[:is_material] = AnatomicalPart.default_is_material_for(origin) if attributes[:is_material].nil?

  anatomical_part = AnatomicalPart.new(
    attributes.merge(
      inbound_origin_relationship_attributes: {
        old_object_id: origin.id,
        old_object_type: origin.class.base_class.name
      }
    )
  )

  anatomical_part.save!
  anatomical_part
end

#create_taxon_determination_if_needed(origin, taxon_determination_attributes) ⇒ Object (private)



81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 81

def create_taxon_determination_if_needed(origin, taxon_determination_attributes)
  return unless ['CollectionObject'].include?(origin.class.base_class.name)
  return unless origin.taxon_determinations.empty?
  return if taxon_determination_attributes.blank?

  taxon_determination = TaxonDetermination.new(
    taxon_determination_object: origin,
    otu_id: taxon_determination_attributes[:otu_id]
  )

  taxon_determination.save!
end

#param(key) ⇒ Object (private)



118
119
120
# File 'lib/biological_associations/create_with_anatomical_parts.rb', line 118

def param(key)
  @params[key]
end