From d016c47789dfcde7a56af3e4b66aee2bf3e21ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Tue, 1 Feb 2022 23:34:03 +0100 Subject: [PATCH] Refactor data migration to use data sets --- .../20220105085729_split_customers_name.rb | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/db/migrate/20220105085729_split_customers_name.rb b/db/migrate/20220105085729_split_customers_name.rb index 19c0a3e594..d52d619747 100644 --- a/db/migrate/20220105085729_split_customers_name.rb +++ b/db/migrate/20220105085729_split_customers_name.rb @@ -1,29 +1,38 @@ +require 'concerns/address_display' +require 'spree/address' + class SplitCustomersName < ActiveRecord::Migration[6.1] - class Customer < ActiveRecord::Base + class Customer < ApplicationRecord + belongs_to :bill_address, class_name: "Spree::Address" end - def change + def up add_column :customers, :first_name, :string, null: false, default: "" add_column :customers, :last_name, :string, null: false, default: "" rename_column :customers, :name, :backup_name - reversible do |dir| - dir.up { migrate_customer_name_data } - end + + migrate_customer_name_data! end - def migrate_customer_name_data - Customer.includes(:bill_address).find_each do |customer| + def down + remove_column :customers, :first_name + remove_column :customers, :last_name + rename_column :customers, :backup_name, :name + end + + def migrate_customer_name_data! + Customer.includes(:bill_address).where.not(bill_address_id: nil).find_each do |customer| bill_address = customer.bill_address - if bill_address.present? && bill_address.firstname.present? && bill_address.lastname? - customer.first_name = bill_address.firstname.strip - customer.last_name = bill_address.lastname.strip - else - first_name, last_name = customer.backup_name.strip.split(' ', 2) - customer.first_name = first_name - customer.last_name = last_name - end + customer.first_name = bill_address.firstname.strip + customer.last_name = bill_address.lastname.strip + customer.save + end + Customer.where(first_name: "", last_name: "").where.not(backup_name: [nil, ""]).find_each do |customer| + first_name, last_name = customer.backup_name.split(' ', 2) + customer.first_name = first_name + customer.last_name = last_name.to_s customer.save end end