我正在维护一个使用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?
答案 0 :(得分:0)
您可以向迁移添加外键以验证引用记录的存在,生成迁移并执行以下操作。
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
希望这有帮助! :)