Class: SampleDetails::Collection

Inherits:
Object
  • Object
show all
Defined in:
app/models/sample_details.rb

Instance Method Summary collapse

Constructor Details

#initialize(samples, groups, fields, values) ⇒ Collection

Returns a new instance of Collection.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'app/models/sample_details.rb', line 4

def initialize(samples, groups, fields, values)
  @samples = samples.to_a
  @countries = @samples.map { |s| s.country }.uniq.sort { |a, b| a.full_name <=> b.full_name }
  @groups = groups.to_a.sort { |a, b| a.order <=> b.order }
  @fields = fields.to_a
  @values = values.to_a

  sample_map = Hash[@samples.map { |s| [s.id, s] }]
  @value_sample_map = {}
  @group_sample_map = {}

  @values.each do |v|
    s = sample_map[v.sample_id]
    g = v.sample_detail_field.sample_detail_group
    (@value_sample_map[s] ||= []) << v
    (@group_sample_map[s] ||= {})[g] = nil
  end

  @group_sample_map.each { |s, v| @group_sample_map[s] = v.keys }
end

Instance Method Details

#countriesObject



25
26
27
# File 'app/models/sample_details.rb', line 25

def countries
  @countries
end

#fields(for_group = nil, exclude_summary_only = false) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/models/sample_details.rb', line 45

def fields(for_group = nil, exclude_summary_only = false)
  if for_group
    data = @fields.select { |f| f.sample_detail_group == for_group }
  else
    data = @fields
  end

  if exclude_summary_only
    data.reject { |f| f.summary_only }
  else
    data
  end
end

#groups(used_by_sample = nil) ⇒ Object



37
38
39
40
41
42
43
# File 'app/models/sample_details.rb', line 37

def groups(used_by_sample = nil)
  if used_by_sample
    @group_sample_map[used_by_sample] || []
  else
    @groups
  end
end

#samples(for_country = nil) ⇒ Object



29
30
31
32
33
34
35
# File 'app/models/sample_details.rb', line 29

def samples(for_country = nil)
  if for_country
    @samples.select { |s| s.country == for_country }
  else
    @samples
  end
end

#value(sample, field) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/models/sample_details.rb', line 59

def value(sample, field)
  field = case field
            when SampleDetailField
              field
            when String
              @fields.detect { |f| f.name == field }
            else
              nil
          end

  return nil unless sample && field

  list = @value_sample_map[sample] || []
  list.detect { |v| v.sample_detail_field_id == field.id }
end