我知道这可能是在互联网上的某个地方,但我在Stackoverflow上找不到答案,所以我想我可以在这里增加一点知识库。
我是Ruby和Rails的新手,但是我的公司正在投入大量资金,所以我想更详细地了解它。
我很难将我的思维方式转变为从“模型”而不是数据库中设计应用程序,所以我试图弄清楚我将如何完成所有的设计工作。而是在Rails模型中的数据库。
所以我自己最近的任务是弄清楚如何配置Rails数据库模型来进行级联删除?有这么简单的方法吗?或者我是否必须进入MySql并进行设置?
答案 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