我可以在Rails中设置Cascade删除吗?

时间:2008-12-01 16:46:48

标签: ruby-on-rails ruby database

我知道这可能是在互联网上的某个地方,但我在Stackoverflow上找不到答案,所以我想我可以在这里增加一点知识库。

我是Ruby和Rails的新手,但是我的公司正在投入大量资金,所以我想更详细地了解它。

我很难将我的思维方式转变为从“模型”而不是数据库中设计应用程序,所以我试图弄清楚我将如何完成所有的设计工作。而是在Rails模型中的数据库。

所以我自己最近的任务是弄清楚如何配置Rails数据库模型来进行级联删除?有这么简单的方法吗?或者我是否必须进入MySql并进行设置?

5 个答案:

答案 0 :(得分:93)

您还可以将:dependent选项设置为:delete_all。 :delete_all将发出单个SQL语句来删除所有子记录。因为这个使用:delete_all可能会给你更好的表现。

has_many :memberships, dependent: :delete_all

答案 1 :(得分:64)

是的,你可以,如果你正在使用像has_many这样的关系你就这样做

has_many :memberships, dependent: :destroy

答案 2 :(得分:18)

与提供的答案相反,我强烈建议在数据库级别上执行此操作。如果您有不同的进程或多线程环境,则可能会发生未正确删除记录的情况。此外,数据库外键在删除大量数据时会更快。

与建议的答案一样,请执行以下操作:

has_many :memberships, dependent: :delete_all

但是也要确保在迁移中设置foreign_key。这样,数据库就会自动为您删除记录。

要删除成员资格时取消值,假设您有用户模型:

add_foreign_key :users, :memberships, on_delete: :nullify

您还可以在删除成员资格时删除所有模型

add_foreign_key :users, :memberships, on_delete: :cascade

答案 3 :(得分:10)

请记住,delete_all不会对子记录执行任何回调(如before_destroy和after_destroy)。

答案 4 :(得分:6)

如果您希望在实际数据库结构中反映出级联删除,看起来这个插件可能会为您提供所需内容:

http://www.redhillonrails.org/foreign_key_migrations.html

在迁移中使用它的格式如下:

create_table :orders do |t|
  t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
  ...
end