我正在维护使用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/

10-11 03:01