🖥
Rails – 値が重複したレコードを削除してからDBに複合ユニーク制約を追加するマイグレーションの例
問題
重複レコードが残ったままだとユニーク制約をDBに追加できない
Caused by:
Mysql2::Error: Duplicate entry '1-1' for key 'users.index_users_on_first_name_and_last_name'
例
- first_name / last_name の組み合わせでDBにユニーク制約を持たせたい
- first_name / last_name が同じ組み合わせのユーザは重複分のレコードを削除したい (1個だけ残したい)
という場合
コードの例
1個のマイグレーションでは重複レコードを削除する
up に ActiveRecord を直接書いてしまう
class RemoveDuplicateUsers < ActiveRecord::Migration[7.0]
def up
dupulicated_users = User.group(:first_name, :last_name).count.filter do |_k, v|
v >= 2
end
dupulicated_users.each do |(first_name, last_name), _count|
User.where(first_name:, last_name:).order(:id).drop(1).each(&:destroy)
end
end
end
次のマイグレーションでは普通に複合ユニーク制約を追加する
class AddUniquenessToUsers < ActiveRecord::Migration[7.0]
def change
add_index :users, %i[first_name last_name], unique: true
end
end
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
ra
Discussion