📜  rails on_delete 级联不起作用 - Ruby (1)

📅  最后修改于: 2023-12-03 15:34:36.673000             🧑  作者: Mango

Rails on_delete 级联不起作用 - Ruby

在Rails中,我们可能会遇到一个问题,就是on_delete级联功能不起作用。在数据库中,我们经常使用外键约束,使得当一个记录被删除时,相关的记录也会被删除或者更新。

问题描述

当我们创建两个表时,一个是articles,一个是comments,在comments表中添加一个article_id外键,当删除一个文章时,相关评论也会被删除。我们可以使用以下代码来添加外键约束:

class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t|
      t.references :article, foreign_key: true, on_delete: :cascade
      t.text :content

      t.timestamps
    end
  end
end

然而,在某些情况下,这种级联功能并不会起作用。我们删除文章时,评论不会被删除。这是为什么呢?

原因

这是因为on_delete级联功能是由数据库来实现的。不同的数据库的实现方式可能有所不同。在某些情况下,尤其是在MySQL中,默认情况下,外键的级联功能是关闭的。

解决方案

要使外键的级联功能生效,我们需要在数据库中设置相应的级联规则。在MySQL中,可以使用以下命令来设置级联规则:

ALTER TABLE comments ADD CONSTRAINT fk_comments_article
FOREIGN KEY (article_id) REFERENCES articles(id) ON DELETE CASCADE;

另外,如果你正在使用PostgreSQL,可以使用以下代码来添加外键约束和级联规则:

class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t|
      t.references :article, foreign_key: { on_delete: :cascade }
      t.text :content

      t.timestamps
    end
    add_foreign_key :comments, :articles, on_delete: :cascade
  end
end
总结

在Rails中,外键的级联功能是由数据库来实现的。因此,要使级联规则生效,我们需要在数据库中设置相应的级联规则。在MySQL中,外键的级联功能默认情况下是关闭的。在PostgreSQL中,可以使用Rails提供的语法来添加级联规则。