Module: Workarea::Details

Extended by:
ActiveSupport::Concern
Included in:
Catalog::Product, Catalog::Variant
Defined in:
app/models/workarea/details.rb

Instance Method Summary collapse

Instance Method Details

#detail_namesArray<String>

Output all names of all details currently stored on this model. If the model has been rehydrated from a raw #as_document Hash of parameters, this method also dives into the current I18n.locale. On models generated by Mongoid or within the context of the current application scope, this method will just read #keys from the details hash stored on the model.

Returns:



94
95
96
97
98
99
100
101
102
103
# File 'app/models/workarea/details.rb', line 94

def detail_names
  locale = I18n.locale.to_s
  hash = if details.keys.include?(locale)
    details[locale]
  else
    details
  end

  hash.keys
end

#fetch_detail(name) ⇒ Object

Find a detail based on a name. Uses string optionizing to determine whether the key on the details hash matches. Used when looking up options in view models.

Parameters:

Returns:

  • anything



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

def fetch_detail(name)
  key = details.keys.detect do |tmp|
    tmp.to_s.optionize == name.to_s.optionize
  end

  return nil unless key.present?
  details[key]
end

#has_detail?(name) ⇒ Boolean

Determine whether this detail applies as an option for this variant

Parameters:

Returns:

  • (Boolean)


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

def has_detail?(name)
  fetch_detail(name).present?
end

#matches_detail?(name, value) ⇒ Boolean

Determine whether this variant is a match to the passed detail. Used when selecting variants in view models.

Parameters:

Returns:

  • (Boolean)


54
55
56
57
58
59
60
61
62
63
# File 'app/models/workarea/details.rb', line 54

def matches_detail?(name, value)
  detail_value = fetch_detail(name)
  return false if detail_value.blank?

  if detail_value.respond_to?(:map)
    detail_value.map(&:to_s).map(&:optionize).include?(value.optionize)
  else
    detail_value.to_s.optionize == value.optionize
  end
end

#matches_details?(details) ⇒ Boolean

Determine whether this variant is a match to the all of the passed details.

Parameters:

  • details (Hash)

Returns:

  • (Boolean)


80
81
82
83
84
# File 'app/models/workarea/details.rb', line 80

def matches_details?(details)
  details.all? do |key, value|
    Array.wrap(value).all? { |v| matches_detail?(key, v) }
  end
end

#update_details(values) ⇒ void

This method returns an undefined value.

Update details by replacing existing detail values with new detail values. If a detail has been explicitly set to blank in the new details, then that detail will be deleted.

Parameters:

  • values (Hash)

    new details to replace existing details



17
18
19
20
21
22
23
24
25
26
# File 'app/models/workarea/details.rb', line 17

def update_details(values)
  values ||= {}
  self.details ||= {}

  details.merge!(values)

  details.each do |name, value|
    details.delete(name) if value.blank?
  end
end