openfoodfoundation/openfoodnetwork

View on GitHub
db/migrate/20230605133804_remove_master_variants.rb

Summary

Maintainability
A
0 mins
Test Coverage
class RemoveMasterVariants < ActiveRecord::Migration[7.0]
  def change
    if ActiveRecord::Base.connection.table_exists? "spree_option_values_variants"
      delete_master_option_values
    end

    handle_master_line_items
    handle_master_exchange_variants
    delete_master_inventory_units
    delete_master_variant_prices
    delete_master_stock_items
    delete_master_variants
  end

  private

  def handle_master_line_items
    ActiveRecord::Base.connection.execute(<<-SQL
      UPDATE spree_variants
      SET is_master = false
      FROM spree_line_items
      WHERE spree_variants.is_master = true
        AND spree_variants.id = spree_line_items.variant_id
    SQL
    )
  end

  def handle_master_exchange_variants
    ActiveRecord::Base.connection.execute(<<-SQL
      UPDATE spree_variants
      SET is_master = false
      FROM exchange_variants
      WHERE spree_variants.is_master = true
        AND spree_variants.id = exchange_variants.variant_id
    SQL
    )
  end

  def delete_master_inventory_units
    ActiveRecord::Base.connection.execute(<<-SQL
      DELETE FROM spree_inventory_units
      USING spree_variants
      WHERE spree_variants.is_master = true
        AND spree_variants.id = spree_inventory_units.variant_id
    SQL
    )
  end

  def delete_master_option_values
    ActiveRecord::Base.connection.execute(<<-SQL
      DELETE FROM spree_option_values_variants
      USING spree_variants
      WHERE spree_variants.is_master = true
        AND spree_variants.id = spree_option_values_variants.variant_id
    SQL
    )
  end

  def delete_master_variant_prices
    ActiveRecord::Base.connection.execute(<<-SQL
      DELETE FROM spree_prices
      USING spree_variants
      WHERE spree_variants.is_master = true
        AND spree_variants.id = spree_prices.variant_id
    SQL
    )
  end

  def delete_master_stock_items
    ActiveRecord::Base.connection.execute(<<-SQL
      DELETE FROM spree_stock_items
      USING spree_variants
      WHERE spree_variants.is_master = true
        AND spree_variants.id = spree_stock_items.variant_id
    SQL
    )
  end

  def delete_master_variants
    ActiveRecord::Base.connection.execute(<<-SQL
      DELETE FROM spree_variants
      WHERE is_master = true
    SQL
    )
  end
end