class FormObj::ModelMapper::Array
Attributes
model_attribute[R]
Public Class Methods
new(item_class, model_attribute, *args)
click to toggle source
Calls superclass method
# 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
Public Instance Methods
load_from_models(models, *args)
click to toggle source
# 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_key()
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 25 def model_primary_key self.item_class.model_primary_key end
sync_to_models(models)
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 17 def sync_to_models(models) items = define_models_for_CUD(models) sync_destruction_to_models(models, items[:destroy]) sync_update_to_models(models, items[:update]) sync_creation_to_models(models, items[:create]) end
to_models_hash(models)
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 29 def to_models_hash(models) self.each { |item| models[:default] << item.to_models_hash(models.merge(default: {}))[:default] } models end
Private Instance Methods
define_models_for_CUD(models)
click to toggle source
Should return hash with 3 keys: :create, :update, :destroy In default implementation: :create - array of form objects to be added :update - hash where key is a model to be updated and value is a form object :destroy - array of models to be marked for deletion
# File lib/form_obj/model_mapper/array.rb, line 55 def define_models_for_CUD(models) to_be_created = [] to_be_updated = {} to_be_destroyed = select(&:marked_for_destruction?).map(&:primary_key) reject(&:marked_for_destruction?).each do |form_object| if model = find_model(models[:default], form_object.primary_key) to_be_updated[model] = form_object else to_be_created << form_object end end { create: to_be_created, update: to_be_updated, destroy: to_be_destroyed } end
find_model(model_array, id)
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 42 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
iterate_through_models_to_load_them(models, *args, &block)
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 38 def iterate_through_models_to_load_them(models, *args, &block) models.each { |model| block.call(model) } end
sync_creation_to_models(models, form_objects_to_create)
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 85 def sync_creation_to_models(models, form_objects_to_create) form_objects_to_create.each do |form_object| models[:default] << model = model_attribute.create_model form_object.sync_to_models(models.merge(default: model)) end end
sync_destruction_to_models(models, ids_to_destroy)
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 71 def sync_destruction_to_models(models, ids_to_destroy) if models[:default].respond_to? :where models[:default].where(model_primary_key.name => ids_to_destroy).each(&:mark_for_destruction) else models[:default].delete_if { |model| ids_to_destroy.include? model_primary_key.read_from_model(model) } end end
sync_update_to_models(models, items_to_update)
click to toggle source
# File lib/form_obj/model_mapper/array.rb, line 79 def sync_update_to_models(models, items_to_update) items_to_update.each_pair do |model, form_object| form_object.sync_to_models(models.merge(default: model)) end end