为什么我的 add_foreign_key on_delete:: 级联名称没有被转移到模式

Spe*_*or6 2 postgresql ruby-on-rails rails-migrations ruby-on-rails-5 postgresql-9.6

为了正确处理 Postgres 的 ForeignKeyViolation 警告,我检查了我的每个模型并添加了 on_delete: 命令,如下所示。

我遵循的格式是

add_foreign_key <:named_table>, <:related_table>, on_delete: :cascade

但是,在进行这些更改并运行后,rails db:reset我注意到这些额外的参数没有传递到生成的 schema.rb 文件中,并且在尝试删除图像时仍然收到上述错误。

我的程序或语法有什么问题吗?先感谢您!

12345_create_document_images.rb

class CreateDocumentImages < ActiveRecord::Migration[5.1]
  def change
    create_table :document_images do |t|
      t.references :document, foreign_key: true
      t.references :image, foreign_key: true

      t.timestamps
    end

    add_foreign_key :document_images, :documents, on_delete: :cascade
    add_foreign_key :document_images, :images, on_delete: :cascade
  end
end
Run Code Online (Sandbox Code Playgroud)

模式文件

 add_foreign_key "document_images", "images"
 add_foreign_key "document_images", "documents"
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 7

当你这样说时:

t.references :document, foreign_key: true
Run Code Online (Sandbox Code Playgroud)

foreign_key: true选项创建相同的外键:

add_foreign_key :document_images, :documents, on_delete: :cascade
Run Code Online (Sandbox Code Playgroud)

做。当add_foreign_key方法执行时,FK 已经存在,所以它应该触发一个PG::DuplicateObject异常,至少对我来说是这样。我不确定为什么您没有收到异常,但这并不重要,重要的是create_table在您尝试on_delete: :cascade通过add_foreign_key呼叫添加 FK 之前,来自的 FK将在那里。

解决方案是让t.references创建 FKon_delete: :cascade并省略显式add_foreign_key调用:

class CreateDocumentImages < ActiveRecord::Migration[5.1]
  def change
    create_table :document_images do |t|
      t.references :document, foreign_key: { on_delete: :cascade }
      t.references :image, foreign_key: { on_delete: :cascade}
      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我还重命名了迁移以匹配它真正在做什么。

由 Spectator6 添加:@mu_is_too_short 向我介绍的其他东西是它的使用rails db:migrate:redo使我也了解了rails db:migrate:reset. 以前,我只使用rails db:reset,但是当我执行他的建议然后运行rails db:migration:reset它时rails db:reset,一切都点击了!该架构反映了外键上的新数据库触发器,并尝试开发中的功能按预期工作。很酷!@mu_is_too_short 的所有道具!