我知道这可能在Internet上的某个地方,但是我在Stackoverflow上找不到答案,所以我想我可能会在这里增加一些知识库。
我是Ruby和Rails的新手,但是我的公司已经对其进行了相当多的投资,因此我试图更详细地了解它。
我很难改变思维方式,从“模型”而不是从数据库设计应用程序,因此我试图弄清如何在数据库中经典地完成所有设计工作。 Rails模型代替。
因此,我给自己的最新任务是弄清楚如何配置Rails数据库模型以进行级联删除?有一个简单的方法吗?还是我必须进入MySql并进行设置?
Answers:
您也可以将:dependent选项设置为:delete_all。:delete_all将发出一条SQL语句以删除所有子记录。因此,使用:delete_all可能会为您带来更好的性能。
has_many :memberships, dependent: :delete_all
:delete_all和:destroy为此的区别。两者都将导致n从数据库中删除子成员身份(用于删除[需要引用]和销毁(如果其子对象具有从属销毁的级别)为1级),但是:destroy将实例化每个子对象并首先运行任何回调,而:delete_all直接运行数据库中的SQL DELETE语句。:destroy因此速度较慢,但是当记录被销毁时,它允许您进行回调。一端绕过Rails,另一端可能有n ^ x实例化。
是的,如果您正在使用has_many之类的关系,则可以这样做
has_many :memberships, dependent: :destroy
与提供的答案相反,我强烈建议您也在数据库级别执行此操作。如果您有不同的进程或多线程环境,则可能会发生记录未正确删除的情况。此外,数据库外键使删除大量数据时的处理速度更快。
像在建议的答案中一样,执行以下操作:
has_many :memberships, dependent: :delete_all
但是,还要确保foreign_key在迁移中设置一个。这样数据库就可以自动为您删除记录。
假设您有用户模型,则在删除成员资格时要使这些值无效:
add_foreign_key :users, :memberships, on_delete: :nullify
您也可以在删除成员资格后删除所有模型
add_foreign_key :users, :memberships, on_delete: :cascade
delete_all在模型中进行设置。外键将帮助您在数据库级别正确删除所有内容。
请记住,delete_all不会在子记录上执行任何回调(例如before_destroy和after_destroy)。
如果您希望级联删除反映在实际的数据库结构中,则该插件似乎可以为您提供所需的信息:
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