mat*_*dev 79 ruby database ruby-on-rails
我知道这可能是在互联网上的某个地方,但我在Stackoverflow上找不到答案,所以我想我可以在这里增加一点知识库.
我是Ruby和Rails的新手,但是我的公司正在投入大量资金,所以我试图更详细地了解它.
我很难将我的思维方式转变为从"模型"而不是从数据库设计应用程序,所以我试图弄清楚如何在数据库中完成我在数据库中所做的所有设计工作. Rails模型代替.
所以我自己最近的任务是弄清楚如何配置Rails数据库模型来进行级联删除?有这么简单的方法吗?或者我是否必须进入MySql并进行设置?
Mik*_*een 95
您还可以将:dependent选项设置为:delete_all.:delete_all将发出单个SQL语句来删除所有子记录.因为这个使用:delete_all可能会给你更好的性能.
has_many :memberships, dependent: :delete_all
Run Code Online (Sandbox Code Playgroud)
dan*_*yer 66
是的,你可以,如果你正在使用像has_many这样的关系你就是这么做的
has_many :memberships, dependent: :destroy
Run Code Online (Sandbox Code Playgroud)
Hen*_*rik 20
与提供的答案相反,我强烈建议在数据库级别上执行此操作.如果您有不同的进程或多线程环境,则可能会发生未正确删除记录的情况.此外,数据库外键在删除大量数据时会更快.
像建议的答案一样做:
has_many :memberships, dependent: :delete_all
Run Code Online (Sandbox Code Playgroud)
但是也要确保foreign_key在迁移中设置a .这样,数据库就会自动为您删除记录.
要在删除成员资格时使值无效,假设您有一个用户模型:
add_foreign_key :users, :memberships, on_delete: :nullify
Run Code Online (Sandbox Code Playgroud)
删除成员资格时,您也可以删除所有模型
add_foreign_key :users, :memberships, on_delete: :cascade
Run Code Online (Sandbox Code Playgroud)
如果您希望在实际数据库结构中反映出级联删除,看起来这个插件可能会为您提供所需内容:
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
Run Code Online (Sandbox Code Playgroud)