diff --git a/models/base.rb b/models/base.rb index e5ca90b45..641d03582 100644 --- a/models/base.rb +++ b/models/base.rb @@ -53,7 +53,7 @@ def self.has_many(name, options = {}) super define_method(name) do - self[name] || [] + self[name] ||= [] end define_method("#{name}=") do |vals| diff --git a/models/concerns/expand_data.rb b/models/concerns/expand_data.rb index 0c7c75edf..3b69f037b 100644 --- a/models/concerns/expand_data.rb +++ b/models/concerns/expand_data.rb @@ -45,6 +45,14 @@ def adapt_relations_between_shipments } end + def add_relation_references + self.relations.each{ |relation| + relation.linked_services.each{ |service| + service.relations << relation + } + } + end + def add_sticky_vehicle_if_routes_and_partitions return if self.preprocessing_partitions.empty? diff --git a/models/relation.rb b/models/relation.rb index 7ad432c3c..9273bb3e4 100644 --- a/models/relation.rb +++ b/models/relation.rb @@ -22,6 +22,7 @@ class Relation < Base field :type, default: :same_route field :lapse, default: nil field :linked_ids, default: [] + has_many :linked_services, class_name: 'Models::Service' field :linked_vehicle_ids, default: [] field :periodicity, default: 1 diff --git a/models/service.rb b/models/service.rb index 742ed558a..ef145d1d1 100644 --- a/models/service.rb +++ b/models/service.rb @@ -56,5 +56,6 @@ class Service < Base has_many :activities, class_name: 'Models::Activity' has_many :sticky_vehicles, class_name: 'Models::Vehicle' has_many :quantities, class_name: 'Models::Quantity' + has_many :relations, class_name: 'Models::Relation' end end diff --git a/models/vrp.rb b/models/vrp.rb index 7309ad2e9..959875585 100644 --- a/models/vrp.rb +++ b/models/vrp.rb @@ -228,6 +228,7 @@ def self.check_consistency(hash) end def self.expand_data(vrp) + vrp.add_relation_references vrp.add_sticky_vehicle_if_routes_and_partitions vrp.adapt_relations_between_shipments vrp.expand_unavailable_days @@ -325,6 +326,7 @@ def self.filter(hash) self.remove_unecessary_units(hash) self.generate_schedule_indices_from_date(hash) + self.generate_linked_service_ids_for_relations(hash) end def self.remove_unecessary_units(hash) @@ -477,6 +479,14 @@ def self.generate_schedule_indices_from_date(hash) hash end + def self.generate_linked_service_ids_for_relations(hash) + hash[:relations]&.each{ |relation| + next unless relation[:linked_ids]&.any? + + relation[:linked_service_ids] = relation[:linked_ids].select{ |id| hash[:services]&.any?{ |s| s[:id] == id } } + } + end + def configuration=(configuration) self.config = configuration self.preprocessing = configuration[:preprocessing] if configuration[:preprocessing]