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

我知道这可能是在互联网上,但我找不到Stackoverflow上的答案,所以我想我可能会提高知识基础在这里一点点。

我是Ruby和Rails的新手,但我的公司正在投入更多的精力,所以我试图更详细地了解它。

我很难将自己的思维转换为从“模型”而不是数据库devise应用程序,所以我试图弄清楚我将如何在数据库中经典地完成所有的devise工作Rails模型。

所以我给自己最近的任务是弄清楚如何configuration一个Rails数据库模型来进行级联删除? 有这样一个简单的方法吗? 或者我将不得不进入MySql并设置?

谢谢。

-Matt

你也可以设置:依赖选项:delete_all。 :delete_all将发出一个单一的SQL语句来删除所有的子logging。 因为这个使用:delete_all可能会给你更好的性能。

has_many :memberships, dependent: :delete_all 

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

 has_many :memberships, dependent: :destroy 

请记住,delete_all不会在子logging上执行任何callback(如before_destroy和after_destroy)。

与提供的答案相反,我强烈build议在数据库级别进行此操作。 如果你有不同的进程或multithreading环境,可能会发生logging没有正确删除。 而且,当删除大量数据时,数据库外键使事情变得更快。

就像在build议的答案一样,这样做:

 has_many :memberships, dependent: :delete_all 

不过也要确保在迁移中设置foreign_key 。 这样数据库负责为你自动删除logging。

假定您有一个用户模型,在删除成员资格时取消这些值:

 add_foreign_key :users, :memberships, on_delete: :nullify 

成员资格被删除后,您也可以删除所有模型

 add_foreign_key :users, :memberships, on_delete: :cascade 

它看起来像这个插件可能会给你你想要的,如果你想级联删除反映在实际的数据库结构:

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