Skip to content

Commit

Permalink
Merged in CHOUETTE-3087-improve-migration-time (pull request #1540)
Browse files Browse the repository at this point in the history
CHOUETTE-3087 Migration Stop Area fare_code into Fare Zone by Workgroup

Approved-by: Luc Donnet
  • Loading branch information
albanpeignier authored and Luc Donnet committed Dec 7, 2023
2 parents 37e8d96 + 8edbf9a commit 0abebe5
Showing 1 changed file with 25 additions and 11 deletions.
36 changes: 25 additions & 11 deletions db/migrate/20230907104115_remove_fare_code_from_stop_areas.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
# frozen_string_literal: true

class RemoveFareCodeFromStopAreas < ActiveRecord::Migration[5.2]
def change
on_public_schema_only do
Chouette::StopArea.where.not(fare_code: nil).includes(stop_area_provider: {workbench: :workgroup}).find_each do |stop_area|
stop_area_provider = stop_area.stop_area_provider
workbench = stop_area_provider.workbench
workgroup = workbench.workgroup
impacted_workgroup_ids = Chouette::StopArea.where.not(fare_code: nil).joins(stop_area_provider: :workbench).distinct.pluck(:workgroup_id)
# Load every impacted Workgroup
impacted_workgroups = Workgroup.where(id: impacted_workgroup_ids)

fare_provider = workbench.default_fare_provider
code_space = workgroup.code_spaces.default
value = stop_area.fare_code
impacted_workgroups.each do |workgroup|
# .. to avoid Workgroup loading in loop :(
CustomFieldsSupport.within_workgroup(workgroup) do
code_space = workgroup.code_spaces.default
stop_areas_with_fare_code = workgroup.stop_area_referential.stop_areas
.where.not(fare_code: nil).includes(stop_area_provider: :workbench)

zone = fare_provider.fare_zones.first_or_create_by_code(code_space, value) do |zone|
zone.name = value
end
# Migrate all Workgroup StopAreas
stop_areas_with_fare_code.find_each do |stop_area|
stop_area_provider = stop_area.stop_area_provider
workbench = stop_area_provider.workbench
fare_provider = workbench.default_fare_provider

value = stop_area.fare_code

stop_area.stop_area_zones.create(zone: zone)
zone = fare_provider.fare_zones.first_or_create_by_code(code_space, value) do |zone|
zone.name = value
end

stop_area.stop_area_zones.create(zone: zone)
end
end
end

remove_column :stop_areas, :fare_code
Expand Down

0 comments on commit 0abebe5

Please sign in to comment.