我正在维护使用Rails 4.2的旧系统,并且出于未知原因,引用是通过以下方式创建的:
t.references :credit_card, null: false
t.references :car, null: false
t.references :profile, null: false
例如,这允许我使用无效的credit_card ID为此模型创建寄存器。
外键未经验证。
生成索引迁移并没有将它们变成fk,也根本没有验证它们:
class AddIndexToRentals < ActiveRecord::Migration
def change
add_index :rentals, :credit_card_id
add_index :rentals, :car_id
add_index :rentals, :profile_id
end
end
如何使这些字段成为外键并仅接受现有的ID?
最佳答案
您可以在迁移中添加外键,以验证引用记录的存在,生成迁移并执行以下操作。
class AddForeignKeyToRentals < ActiveRecord::Migration
def change
add_foreign_key :rentals, :credit_cards
add_foreign_key :rentals, :cars
add_foreign_key :rentals, :profiles
end
end
需要注意的一件事是,如果外键列中不存在记录,则将无法运行此迁移。您也可以在模型中添加额外的存在验证。
validates :credit_card, :car, :profile, presence: true
希望这可以帮助! :)
关于mysql - Rails 4.2:将引用字段转换为外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47659538/