Class: FieldValue

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
FieldValueKrill, FieldValuePlanner
Defined in:
app/models/field_value.rb

Overview

Simply put: a representation of an input, output, or parameter of an Operation.

In more detail: an Item, Sample, or parameter of the inputs/outputs of an Operation or of the properties of a Sample that can be verified as allowed for that Operation or Sample by the corresponding FieldType of the respective parent OperationType or SampleType.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from FieldValueKrill

#info, #make, #make_collection, #make_part, #part?, #retrieve

Class Method Details

.create_number(sample, ft, values) ⇒ Object

TODO: dead code



135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'app/models/field_value.rb', line 135

def self.create_number(sample, ft, values)
  values.each do |v|
    if ft.choices && ft.choices != ''
      choices = ft.choices.split(',').collect(&:to_f)
      unless choices.member? v.to_f
        sample.errors.add :choices, "#{v} is not a valid choice for #{ft.name}"
        raise ActiveRecord::Rollback
      end
    end
    fv = sample.field_values.create name: ft.name, value: v.to_f
    fv.save
  end
end

.create_sample(sample, ft, values) ⇒ Object

TODO: dead code



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'app/models/field_value.rb', line 158

def self.create_sample(sample, ft, values)
  values.each do |v|
    if v.class == Sample
      child = v
    elsif v.class == Integer
      child = Sample.find_by(id: v)
      unless sample
        sample.errors.add :sample, "Could not find sample with id #{v} for #{ft.name}"
        raise ActiveRecord::Rollback
      end
    else
      sample.errors.add :sample, "#{v} should be a sample for #{ft.name}"
      raise ActiveRecord::Rollback
    end

    unless ft.allowed? child
      sample.errors.add :sample, "#{v} is not an allowable sample_type for #{ft.name}"
      raise ActiveRecord::Rollback
    end

    fv = sample.field_values.create name: ft.name, child_sample_id: child.id
    fv.save
  end
end

.create_string(sample, ft, values) ⇒ Object

TODO: dead code



120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'app/models/field_value.rb', line 120

def self.create_string(sample, ft, values)
  values.each do |v|
    if ft.choices && ft.choices != ''
      choices = ft.choices.split(',')
      unless choices.member? v
        sample.errors.add :choices, "#{v} is not a valid choice for #{ft.name}"
        raise ActiveRecord::Rollback
      end
    end
    fv = sample.field_values.create name: ft.name, value: v
    fv.save
  end
end

.create_url(sample, ft, values) ⇒ Object

TODO: dead code



150
151
152
153
154
155
# File 'app/models/field_value.rb', line 150

def self.create_url(sample, ft, values)
  values.each do |v|
    fv = sample.field_values.create name: ft.name, value: v
    fv.save
  end
end

.creator(sample, field_type, raw) ⇒ Object

TODO: dead code



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'app/models/field_value.rb', line 184

def self.creator(sample, field_type, raw) # sample, field_type, raw_field_data

  values = []
  if field_type.array
    if raw.class != Array
      sample.errors.add :array, "#{field_type.name} should be an array."
      raise ActiveRecord::Rollback
    end
    values = raw
  else
    values = [raw]
  end

  method('create_' + field_type.type).call(sample, field_type, values)
end

Instance Method Details

#child_data(name) ⇒ Object



228
229
230
# File 'app/models/field_value.rb', line 228

def child_data(name)
  child_item.get(name) if child_item_id
end

#collectionCollection

Return associated Collection

Returns:



63
64
65
# File 'app/models/field_value.rb', line 63

def collection
  Collection.find(child_item.id) if child_item
end

#collection_part(row, column) ⇒ Item

Return the specified part of collection

Parameters:

  • row (Fixnum)
  • column (Fixnum)

Returns:



79
80
81
82
# File 'app/models/field_value.rb', line 79

def collection_part(row, column)
  pas = PartAssociation.where(collection_id: child_item_id, row: row, column: column)
  pas.first.part if pas.length == 1
end

#copy_inventory(fv) ⇒ Object



256
257
258
259
260
261
# File 'app/models/field_value.rb', line 256

def copy_inventory(fv)
  self.child_item_id = fv.child_item_id
  self.row = fv.row
  self.column = fv.column
  save
end

#exportObject



221
222
223
224
225
226
# File 'app/models/field_value.rb', line 221

def export
  attributes.merge(
    child_sample: child_sample.as_json,
    child_item: child_item.as_json
  )
end

#field_typeFieldType

Gets the FieldType which defines this field value.

Returns:



25
# File 'app/models/field_value.rb', line 25

belongs_to :field_type

#full_json(_options = {}) ⇒ Object



268
269
270
271
272
273
274
275
276
277
278
279
280
# File 'app/models/field_value.rb', line 268

def full_json(_options = {})
  as_json(include: [
            :child_sample,
            :wires_as_source,
            :wires_as_dest,
            allowable_field_type: {
              include: %i[
                object_type
                sample_type
              ]
            }
          ])
end

#itemItem

Return associated Item.

Returns:



45
46
47
# File 'app/models/field_value.rb', line 45

def item
  child_item
end

Return an html link to the item ui for the Item associated with this field value.

Returns:

  • (String)


52
53
54
55
56
57
58
# File 'app/models/field_value.rb', line 52

def item_link
  if child_item_id
    child_item.to_s
  else
    '?'
  end
end

#nameString

Gets name of FieldValue. Will be the same as the name of the Parent FieldType.

Returns:

  • (String)

    the name of the FieldValue, as in "Forward Primer"



30
# File 'app/models/field_value.rb', line 30

attr_accessible :name

#partItem

Return associated Part if this fv refers to a part of a collection

Returns:



70
71
72
# File 'app/models/field_value.rb', line 70

def part
  collection_part row, column
end

#routingObject



263
264
265
266
# File 'app/models/field_value.rb', line 263

def routing
  ft = field_type
  ft ? ft.routing : nil
end

#sampleSample

Return associated Sample.

Returns:



38
39
40
# File 'app/models/field_value.rb', line 38

def sample
  child_sample
end

#set(opts = {}) ⇒ Object

Set Item, Collection, or row or column.

Examples:

For debugging, set input to specific plate

if debug
  plate = Item.find(125234)
  operations.first.input("Plate").set item: plate if plate
end

Parameters:

  • opts (Hash) (defaults to: {})

Options Hash (opts):

  • :item (Item)
  • :collection (Collection)
  • :row (Integer)
  • :column (Integer)


248
249
250
251
252
253
254
# File 'app/models/field_value.rb', line 248

def set(opts = {})
  self.child_item_id = opts[:item].id if opts[:item]
  self.child_item_id = opts[:collection].id if opts[:collection]
  self.row = opts[:row] if opts[:row]
  self.column = opts[:column] if opts[:column]
  save
end

#set_child_data(name, value) ⇒ Object



232
233
234
# File 'app/models/field_value.rb', line 232

def set_child_data(name, value)
  child_item.associate(name, value) if child_item_id
end

#to_sObject

TODO: URLs belong elsewhere



201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'app/models/field_value.rb', line 201

def to_s
  if child_sample_id
    c = Sample.find_by(id: child_sample_id)
    if c
      "<a href='/samples/#{c.id}'>#{c.name}</a>"
    else
      "? #{child_sample_id} not found ?"
    end
  elsif child_item_id
    c = Item.includes(:object_type).find_by(id: child_sample_id)
    if c
      "<a href='/items/#{c.id}'>#{c.object_type.name} #{c.id}</a>"
    else
      "? #{child_item_id} not found ?"
    end
  else
    value
  end
end

#valFloat, ...

Return associated parameter value.

Returns:

  • (Float, String, Hash, Sample, Item)

    The value of the FieldValue of the type specified in the operation type definition



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/field_value.rb', line 89

def val
  if field_type
    ft = field_type
  elsif sample && sample_type
    fts = sample.sample_type.field_types.select { |type| type.name == name }
    return nil unless fts.length == 1

    ft = ft.first
  else
    return nil
  end

  case ft.type
  when 'string', 'url'
    value
  when 'json'
    begin
      JSON.parse value, symbolize_names: true
    rescue JSON::ParserError => e
      { error: e, original_value: value }
    end
  when 'number'
    value.to_f
  when 'sample'
    child_sample
  when 'item'
    child_item
  end
end