假设Cancellationbelongs_toSubscription,并且已使用常规Rails 7 add_reference语句执行了DB迁移,则会产生以下DB情况:
Cancellation
belongs_to
Subscription
add_reference
cancellations.subscription_id
index_cancellations_on_subscription_id
目标是向索引添加唯一性约束,以确保没有两个取消可以属于同一订阅。存在现有数据,我们不希望销毁它。
q9yhzks01#
Rails还没有change_index方法。要添加唯一性约束条件,必须删除并重新创建索引。但是不能删除它,因为外键需要它。因此,必须先删除外键。迁移过程如下所示:
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
这不会改变列的内容,因此数据是安全的。如果存在任何重复项,迁移将失败,因此请确保先清除数据。
1条答案
按热度按时间q9yhzks01#
Rails还没有
change_index
方法。要添加唯一性约束条件,必须删除并重新创建索引。但是不能删除它,因为外键需要它。因此,必须先删除外键。迁移过程如下所示:
这不会改变列的内容,因此数据是安全的。如果存在任何重复项,迁移将失败,因此请确保先清除数据。