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

ylamdve6  于 5个月前  发布在  Ruby
关注(0)|答案(5)|浏览(56)

我知道这可能是在互联网上的某个地方,但我找不到答案在这里的Stackoverflow,所以我想我可能会提高知识库在这里一点。
我是Ruby和Rails的新手,但我的公司在这方面投入了很多,所以我想更详细地了解它。
对我来说,很难改变我的心态,从“模型”而不是从数据库设计应用程序,所以我试图弄清楚如何在Rails模型中完成我在数据库中经典完成的所有设计工作。
所以我给自己的最新任务是弄清楚如何配置Rails数据库模型来进行级联删除?有没有简单的方法来做到这一点?或者我必须进入MySql并设置它?

tcomlyy6

tcomlyy61#

你也可以设置:dependent选项为:delete_all.:delete_all将发出一条SQL语句来删除所有的子记录.因此使用:delete_all可以给予更好的性能.

has_many :memberships, dependent: :delete_all

字符串

b5lpy0ml

b5lpy0ml2#

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

has_many :memberships, dependent: :destroy

字符串

bbuxkriu

bbuxkriu3#

与所提供的答案相反,我强烈建议在数据库级别上也这样做。如果您有不同的进程或多线程环境,可能会发生记录未正确删除的情况。此外,数据库外键在删除大量数据时可以更快地删除。
就像在建议的答案中这样做:

has_many :memberships, dependent: :delete_all

字符串
但是,也要确保在迁移中设置foreign_key。这样数据库会自动为您删除记录。
要在删除成员资格时使值无效,假设您有一个用户模型:

add_foreign_key :users, :memberships, on_delete: :nullify


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

add_foreign_key :users, :memberships, on_delete: :cascade

b91juud3

b91juud34#

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

34gzjxbg

34gzjxbg5#

看起来这个插件可能会给你给予你想要的东西,如果你想在实际的数据库结构中反映级联删除:
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

字符串

相关问题