Class: OnlineMigrations::DataMigrations::ReconcileRoomStatesForCompletedQuotes
- Inherits:
-
OnlineMigrations::DataMigration
- Object
- OnlineMigrations::DataMigration
- OnlineMigrations::DataMigrations::ReconcileRoomStatesForCompletedQuotes
- Defined in:
- lib/online_migrations/data_migrations/reconcile_room_states_for_completed_quotes.rb
Overview
Online migration helper: reconcile room states for completed quotes.
Constant Summary collapse
- BATCH_SIZE =
Batch size.
500
Instance Method Summary collapse
Instance Method Details
#collection ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/online_migrations/data_migrations/reconcile_room_states_for_completed_quotes.rb', line 10 def collection # Use subquery to get unique room IDs, then select from RoomConfiguration. # This avoids JSON column comparison issues with DISTINCT. room_ids = RoomConfiguration .joins('INNER JOIN quotes_room_configurations qrc ON qrc.room_configuration_id = room_configurations.id') .joins('INNER JOIN quotes q ON q.id = qrc.quote_id') .joins('INNER JOIN opportunities opp ON opp.id = room_configurations.opportunity_id') .where(state: 'draft') .where('q.state = ? OR opp.state = ?', 'complete', 'won') .where('NOT EXISTS (SELECT 1 FROM orders_room_configurations orc INNER JOIN orders o ON o.id = orc.order_id WHERE orc.room_configuration_id = room_configurations.id AND o.state NOT IN (\'cancelled\', \'archived\'))') .group('room_configurations.id') .select('room_configurations.id') RoomConfiguration.where(id: room_ids).in_batches(of: BATCH_SIZE) end |
#count ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/online_migrations/data_migrations/reconcile_room_states_for_completed_quotes.rb', line 43 def count # Count unique room IDs from the subquery RoomConfiguration .joins('INNER JOIN quotes_room_configurations qrc ON qrc.room_configuration_id = room_configurations.id') .joins('INNER JOIN quotes q ON q.id = qrc.quote_id') .joins('INNER JOIN opportunities opp ON opp.id = room_configurations.opportunity_id') .where(state: 'draft') .where('q.state = ? OR opp.state = ?', 'complete', 'won') .where('NOT EXISTS (SELECT 1 FROM orders_room_configurations orc INNER JOIN orders o ON o.id = orc.order_id WHERE orc.room_configuration_id = room_configurations.id AND o.state NOT IN (\'cancelled\', \'archived\'))') .distinct .count('room_configurations.id') end |
#process(rooms) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/online_migrations/data_migrations/reconcile_room_states_for_completed_quotes.rb', line 29 def process(rooms) # Bulk update all rooms in the batch to 'complete' state using update_all. # This is equivalent to update_column but for multiple records — skips # callbacks and validations. More efficient than processing each room # individually. room_ids = rooms.ids return if room_ids.empty? RoomConfiguration.where(id: room_ids).update_all( state: 'complete', updated_at: Time.current ) end |