Rails 7 + MariaDB:将缺少的唯一性约束添加到belongs_to引用的列

f0brbegy  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(142)

假设Cancellationbelongs_toSubscription,并且已使用常规Rails 7 add_reference语句执行了DB迁移,则会产生以下DB情况:

  • 有一列cancellations.subscription_id
  • 存在索引index_cancellations_on_subscription_id
  • 存在从取消到预订的外键约束

目标是向索引添加唯一性约束,以确保没有两个取消可以属于同一订阅。
存在现有数据,我们不希望销毁它。

q9yhzks0

q9yhzks01#

Rails还没有change_index方法。要添加唯一性约束条件,必须删除并重新创建索引。但是不能删除它,因为外键需要它。因此,必须先删除外键。
迁移过程如下所示:

class AddUniquenessConstraintToSubscriptionCancellations < ActiveRecord::Migration[7.0]
  def change
    remove_foreign_key :cancellations, :subscriptions
    remove_index :cancellations, :subscription_id
    add_index :cancellations, subscription_id, unique: true
    add_foreign_key :cancellations, :subscriptions
  end
end

这不会改变列的内容,因此数据是安全的。如果存在任何重复项,迁移将失败,因此请确保先清除数据。

相关问题