为什么我的 add_foreign_key on_delete: :cascade designations 没有被转移到 schema
Why are my add_foreign_key on_delete: :cascade designations not being transferred to the schema
为了正确处理 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
schema.rb
add_foreign_key "document_images", "images"
add_foreign_key "document_images", "documents"
当你这样说时:
t.references :document, foreign_key: true
foreign_key: true
选项创建相同的外键:
add_foreign_key :document_images, :documents, on_delete: :cascade
确实如此。当 add_foreign_key
方法执行时,FK 已经存在,因此它应该触发 PG::DuplicateObject
异常,至少对我来说是这样。我不确定为什么你没有得到异常,但这并不重要,重要的是来自 create_table
的 FK 会在你尝试添加带有 on_delete: :cascade
的 FK 之前存在你的 add_foreign_key
个电话。
解决方案是让 t.references
使用 on_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
我还重命名了迁移以匹配它的实际用途。
旁观者 6 添加:@mu_is_too_short 向我介绍的另一件事是 rails db:migrate:redo
的使用,这让我也了解了 rails db:migrate:reset
。以前,我只使用 rails db:reset
,但当我实施他的建议然后 运行 rails db:migration:reset
然后 rails db:reset
时,一切都点击了!该架构反映了 foreign_key 上的新数据库触发器,并按预期在开发中试用了该功能。很酷!所有道具@mu_is_too_short!
为了正确处理 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
schema.rb
add_foreign_key "document_images", "images"
add_foreign_key "document_images", "documents"
当你这样说时:
t.references :document, foreign_key: true
foreign_key: true
选项创建相同的外键:
add_foreign_key :document_images, :documents, on_delete: :cascade
确实如此。当 add_foreign_key
方法执行时,FK 已经存在,因此它应该触发 PG::DuplicateObject
异常,至少对我来说是这样。我不确定为什么你没有得到异常,但这并不重要,重要的是来自 create_table
的 FK 会在你尝试添加带有 on_delete: :cascade
的 FK 之前存在你的 add_foreign_key
个电话。
解决方案是让 t.references
使用 on_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
我还重命名了迁移以匹配它的实际用途。
旁观者 6 添加:@mu_is_too_short 向我介绍的另一件事是 rails db:migrate:redo
的使用,这让我也了解了 rails db:migrate:reset
。以前,我只使用 rails db:reset
,但当我实施他的建议然后 运行 rails db:migration:reset
然后 rails db:reset
时,一切都点击了!该架构反映了 foreign_key 上的新数据库触发器,并按预期在开发中试用了该功能。很酷!所有道具@mu_is_too_short!