diff options
Diffstat (limited to 'app/models/merge.rb')
| -rw-r--r-- | app/models/merge.rb | 32 | 
1 files changed, 31 insertions, 1 deletions
| diff --git a/app/models/merge.rb b/app/models/merge.rb index f0dc7a459..3217efe07 100644 --- a/app/models/merge.rb +++ b/app/models/merge.rb @@ -107,6 +107,19 @@ class Merge < ActiveRecord::Base      # Routes +    # Always the same pattern : +    # - load models from original Referential +    # - load associated datas (children, checksum for associated models) +    # - switch to new Referential +    # - enumerate loaded models +    # - skip model if its checksum exists "in the same line" +    # - prepare attributes for a fresh model +    # - remove all primary keys +    # - compute an ObjectId (TODO) +    # - process children models as nested attributes +    # - associated other models (by line/checksum) +    # - save! and next one +      referential_routes = referential.switch do        referential.routes.all.to_a      end @@ -205,6 +218,8 @@ class Merge < ActiveRecord::Base        end      end +    # Vehicle Journeys +      referential_vehicle_journeys = referential.switch do        referential.vehicle_journeys.includes(:vehicle_journey_at_stops).all.to_a      end @@ -250,12 +265,17 @@ class Merge < ActiveRecord::Base        end      end +    # Time Tables +      referential_time_tables_by_id, referential_time_tables_with_lines = referential.switch do        time_tables_by_id = Hash[referential.time_tables.includes(:dates, :periods).all.to_a.map { |t| [t.id, t] }]        time_tables_with_associated_lines =          referential.time_tables.joins(vehicle_journeys: {route: :line}).pluck("lines.id", :id, "vehicle_journeys.checksum") +      # Because TimeTables will be modified according metadata periods +      # we're loading timetables per line (line is associated to a period list) +      #        # line_id: [ { time_table.id, vehicle_journey.checksum } ]        time_tables_by_lines = time_tables_with_associated_lines.inject(Hash.new { |h,k| h[k] = [] }) do |hash, row|          hash[row.shift] << {id: row.first, vehicle_journey_checksum: row.second} @@ -267,11 +287,16 @@ class Merge < ActiveRecord::Base      new.switch do        referential_time_tables_with_lines.each do |line_id, time_tables_properties| +        # Because TimeTables will be modified according metadata periods +        # we're loading timetables per line (line is associated to a period list)          line = workbench.line_referential.lines.find(line_id)          time_tables_properties.each do |properties|            time_table = referential_time_tables_by_id[properties[:id]] +          # we can't test if TimeTable already exist by checksum +          # because checksum is modified by intersect_periods! +            attributes = time_table.attributes.merge(              id: nil,              comment: "Ligne #{line.name} - #{time_table.comment}", @@ -300,10 +325,15 @@ class Merge < ActiveRecord::Base            candidate_time_table.set_current_checksum_source            candidate_time_table.update_checksum +          # after intersect_periods!, the checksum is the expected one +          # we can search an existing TimeTable +            existing_time_table = line.time_tables.find_by checksum: candidate_time_table.checksum            unless existing_time_table -            # TimeTable checksum can change on cleanup +            # FIXME use real ObjectId +            # Referential id is (temporary) used because the "same" TimeTable can be defined in several merged Referentials +            # and checksum are modified by clean/remove_periods! but this temporary object id is constant              candidate_time_table.objectid = "merge:time_table:#{line.id}-#{candidate_time_table.checksum}-#{referential.id}:LOC"              candidate_time_table.save! | 
