例如,我有两个模型:

class CheckInDetail < ApplicationRecord
  belongs_to :product
end

class Product < ApplicationRecord
end

例如,当我插入CheckInDetail时,我将外键product_id添加到哈希参数。我尝试使用一些不存在的产品ID和列product_id将为空。我想在这样插入时抛出异常。
有一种方法可以在插入之前使用validateon model检查该字段。但我认为这将花费时间(因为我插入了一堆项目),并不是真正必要的,因为客户不这样做。(以防万一真的出了问题)。

最佳答案

这是关系数据库的好处之一,因为您可以在迁移中添加一个外键引用,并且一切都应该正常工作。
您可以使用rails g migration add_foreign_key_to_check_in_details运行迁移
在迁移过程中,应添加以下内容:

class AddForeignKeyToCheckInDetails < AR::Migration
  def change
    remove_foreign_key :check_in_details, :products
    add_foreign_key :check_in_details, :products, dependent: :delete
  end
end

有了这一点,所有试图挽救一个不存在的产品将失败。还要确保在product_id列中添加not null约束,因为尝试使用空产品id保存check_in_detail将成功。迁移的更新如下所示:
change_column :check_in_details, :product_id, :integer, null: false

如果这能回答你的问题,请告诉我。

关于ruby-on-rails - ActiveRecord:引用键不存在时如何引发异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38806447/

10-12 05:46