Module: ActiveInteraction::Extras::ModelFields

Extended by:
ActiveSupport::Concern
Included in:
All
Defined in:
lib/active_interaction/extras/model_fields.rb

Defined Under Namespace

Classes: Context

Instance Method Summary collapse

Instance Method Details

#any_changed?(*fields) ⇒ Boolean

checks if value was given to the service and the value is different from the one on the model

Returns:

  • (Boolean)


61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/active_interaction/extras/model_fields.rb', line 61

def any_changed?(*fields)
  fields.any? do |field|
    model_field = self.class.model_field_cache_inverse[field]
    value_changed = true

    if model_field
      value_changed = send(model_field).send(field) != send(field)
    end

    inputs.given?(field) && value_changed
  end
end

#changed_model_fields(model_name) ⇒ Object

returns hash of only changed model fields and their values



15
16
17
18
19
# File 'lib/active_interaction/extras/model_fields.rb', line 15

def changed_model_fields(model_name)
  model_fields(model_name).select do |field, _value|
    any_changed?(field)
  end
end

#given_model_fields(model_name) ⇒ Object

returns hash of only given model fields and their values



22
23
24
25
26
# File 'lib/active_interaction/extras/model_fields.rb', line 22

def given_model_fields(model_name)
  model_fields(model_name).select do |field, _value|
    inputs.given?(field)
  end
end

#initializeObject

overwritten to pre-populate model fields



75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/active_interaction/extras/model_fields.rb', line 75

def initialize(...)
  super

  self.class.filters.each do |name, filter|
    next if inputs.given?(name)

    model_field = self.class.model_field_cache_inverse[name]
    next if model_field.nil?

    value = public_send(model_field)&.public_send(name)
    input = filter.process(value, self)
    public_send("#{name}=", input.value)
  end
end

#model_fields(model_name) ⇒ Object

returns hash of all model fields and their values



7
8
9
10
11
12
# File 'lib/active_interaction/extras/model_fields.rb', line 7

def model_fields(model_name)
  fields = self.class.model_field_cache[model_name]
  fields.to_h do |field|
    [field, public_send(field)]
  end
end