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)
当你这样说时:
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 的所有道具!