Rails无法删除或更新父行:外键约束失败

Fel*_*lix 8 mysql ruby-on-rails reference ruby-on-rails-4

我想从我的数据库中删除一些东西.该值引用其他一些表.

错误是:

Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails
Run Code Online (Sandbox Code Playgroud)

我该如何正确解决这个问题?

如果我添加一些像删除级联一样的约束,其他值将不会被删除吗?

编辑:

def delete
   @vid = Movie.find params[:id]
   @vid.delete
   redirect_to :action => :add
end
Run Code Online (Sandbox Code Playgroud)

更新模型

movie.rb

class Movie < ActiveRecord::Base
  has_many :comments, :dependent => :destroy
  has_many :ratings
  belongs_to :channel
  has_and_belongs_to_many :tags
  has_and_belongs_to_many :categories
  mount_uploader :video, MovieUploader
Run Code Online (Sandbox Code Playgroud)

comment.rb

class Comment < ActiveRecord::Base
  belongs_to :movie
  belongs_to :user
  belongs_to :rating
Run Code Online (Sandbox Code Playgroud)

Bol*_*z0r 9

确保您的父Model.rb具有

has_many :model, :dependent => :delete_all 
Run Code Online (Sandbox Code Playgroud)

这样可以确保在删除父模型后删除所有数据.

比如你有Post.rb和Comment.rb

Post.rb

has_many :Comments, :dependent => :delete_all
Run Code Online (Sandbox Code Playgroud)

因此,当您删除帖子时,所有相应的评论也将被删除.

希望它有所帮助

干杯

  • 谢谢,但没有任何效果。错误仍然出现 (2认同)

Rae*_*nha 9

如果您使用了创建外键ActiveRecord::Migration,它将ON DELETE RESTRICT默认使用(即,与您想要的相反:如果有来自其他表的引用的条目,则不会删除行条目).

您需要更改要使用的迁移ON DELETE CASCADE:

class CreateChild < ActiveRecord::Migration
  def change
    create_table :child do |t|
      t.references :parent, foreign_key: {on_delete: :cascade}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)