Class: FormObj::ModelMapper::Array

Inherits:
Form::Array show all
Defined in:
lib/form_obj/model_mapper/array.rb

Instance Method Summary collapse

Methods inherited from Form::Array

#mark_as_persisted, #mark_for_destruction, #persisted?

Methods inherited from Struct::Array

#build, #create, #to_hash, #update_attributes

Constructor Details

#initialize(item_class, model_attribute, *args) ⇒ Array

Returns a new instance of Array.



4
5
6
7
# File 'lib/form_obj/model_mapper/array.rb', line 4

def initialize(item_class, model_attribute, *args)
  @model_attribute = model_attribute
  super(item_class, *args)
end

Instance Method Details

#delete_models(model_array, ids_to_delete) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/form_obj/model_mapper/array.rb', line 48

def delete_models(model_array, ids_to_delete)
  if model_array.respond_to?(:destroy_all)
    model_array.destroy_all(model_primary_key.name => ids_to_delete)
  else
    model_array.delete_if { |m| ids_to_delete.include?(model_primary_key.read_from_model(m)) }
  end
end

#find_model(model_array, id) ⇒ Object



40
41
42
43
44
45
46
# File 'lib/form_obj/model_mapper/array.rb', line 40

def find_model(model_array, id)
  if model_array.respond_to?("find_by_#{model_primary_key.name}")
    model_array.send("find_by_#{model_primary_key.name}", id)
  else
    model_array.find { |m| model_primary_key.read_from_model(m) == id }
  end
end

#load_from_models(models, *args) ⇒ Object



9
10
11
12
13
14
15
# File 'lib/form_obj/model_mapper/array.rb', line 9

def load_from_models(models, *args)
  clear
  iterate_through_models_to_load_them(models[:default] || [], *args) do |model|
    build.load_from_models(models.merge(default: model), *args)
  end
  self
end

#model_primary_keyObject



56
57
58
# File 'lib/form_obj/model_mapper/array.rb', line 56

def model_primary_key
  self.item_class.model_primary_key
end

#sync_to_models(models) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/form_obj/model_mapper/array.rb', line 17

def sync_to_models(models)
  model_array = models[:default]
  ids_exists = []
  items_to_add = []

  self.each do |item|
    if model = find_model(model_array, id = item.primary_key)
      item.sync_to_models(models.merge(default: model))
      ids_exists << id
    else
      items_to_add << item
    end
  end

  ids_to_remove = model_array.map { |m| model_primary_key.read_from_model(m) } - ids_exists
  delete_models(model_array, ids_to_remove)

  items_to_add.each do |item|
    model_array << model = model_attribute.create_model
    item.sync_to_models(models.merge(default: model))
  end
end

#to_models_hash(models) ⇒ Object



60
61
62
63
# File 'lib/form_obj/model_mapper/array.rb', line 60

def to_models_hash(models)
  self.each { |item| models[:default] << item.to_models_hash(models.merge(default: {}))[:default] }
  models
end